日期:2014-05-16  浏览次数:20759 次

一个关于数据报socket的问题
今天写了一个Linux下的基于数据报socket的简单客户/服务器程序,程序很简单,就是服务器把客户程序发送过来的字符由大写变成小写。但是在运行时,无论运行多少个客户端,总会有一个客户端接收不到服务器发给它的信息。希望大家指教一下。
服务器程序文件为sockserver2.c,代码如下:
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

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("%c\n", buffer[0]);
}
}
close(server_sockfd);
}


客户程序文件为sockclient.c,代码如下:
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <stdio.h>

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 = %c\n", c);
close(sockfd);
exit(0);