当前位置: 技术问答>linux和unix
一个关于数据报socket的问题
来源: 互联网 发布时间:2017-04-23
本文导语: 今天写了一个Linux下的基于数据报socket的简单客户/服务器程序,程序很简单,就是服务器把客户程序发送过来的字符由大写变成小写。但是在运行时,无论运行多少个客户端,总会有一个客户端接收不到服务器发给它...
今天写了一个Linux下的基于数据报socket的简单客户/服务器程序,程序很简单,就是服务器把客户程序发送过来的字符由大写变成小写。但是在运行时,无论运行多少个客户端,总会有一个客户端接收不到服务器发给它的信息。希望大家指教一下。
服务器程序文件为sockserver2.c,代码如下:
客户程序文件为sockclient.c,代码如下:
第一次运行结果如下:
可以看到有一个客户程序没有结束(客户端./sockclient2.exe E),但是服务确实已经发送数据了,因为服务器在发送数据后,会输出发送的数据。下面再来看看第二次运行的结果,如下:
可以看到这次的运行是成功的,三个客户程序都正常运行。经过实验,后面的客户都可以正常运行了。只是在第一次启动服务器程序时运行客户程序会出现这种现象,而且总是只有一个客户程序运行不正常。
希望各们大虾帮忙解答一下。谢谢!
服务器程序文件为sockserver2.c,代码如下:
#include
#include
#include
#include
#include
#include
#include
int main()
{
int server_sockfd = -1;
int server_len = 0;
int client_len = 0;
char buffer[512];
int result = 0;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
server_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(9739);
server_len = sizeof(server_addr);
bind(server_sockfd, (struct sockaddr*)&server_addr, server_len);
signal(SIGCHLD, SIG_IGN);
while(1)
{
result = recvfrom(server_sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&client_addr, &client_len);
if(fork() == 0)
{
buffer[0] += 'a' - 'A';
sleep(5);
sendto(server_sockfd, buffer, sizeof(buffer),0 , (struct sockaddr*)&client_addr, client_len);
printf("%cn", buffer[0]);
}
}
close(server_sockfd);
}
客户程序文件为sockclient.c,代码如下:
#include
#include
#include
#include
#include
#include
int main(int agrc, char *argv[])
{
struct sockaddr_in server_addr;
int server_len = 0;
int sockfd = -1;
int result = 0;
char c = 'A';
if(agrc > 1)
c = argv[1][0];
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
server_addr.sin_port = htons(9739);
server_len = sizeof(server_addr);
sendto(sockfd, &c, sizeof(char), 0,
(struct sockaddr*)&server_addr, server_len);
recvfrom(sockfd, &c, sizeof(char), 0, 0, 0);
printf("char from server = %cn", c);
close(sockfd);
exit(0);
}
第一次运行结果如下:
可以看到有一个客户程序没有结束(客户端./sockclient2.exe E),但是服务确实已经发送数据了,因为服务器在发送数据后,会输出发送的数据。下面再来看看第二次运行的结果,如下:
可以看到这次的运行是成功的,三个客户程序都正常运行。经过实验,后面的客户都可以正常运行了。只是在第一次启动服务器程序时运行客户程序会出现这种现象,而且总是只有一个客户程序运行不正常。
希望各们大虾帮忙解答一下。谢谢!
|
子进程没有退出
if(fork() == 0)
{
buffer[0] += 'a' - 'A';
sleep(5);
sendto(server_sockfd, buffer, sizeof(buffer),0 , (struct sockaddr*)&client_addr, client_len);
printf("%cn", buffer[0]);
exit(0); //子进程退出
}
if(fork() == 0)
{
buffer[0] += 'a' - 'A';
sleep(5);
sendto(server_sockfd, buffer, sizeof(buffer),0 , (struct sockaddr*)&client_addr, client_len);
printf("%cn", buffer[0]);
exit(0); //子进程退出
}
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。