2011-11-06 34 views
0

所以我环顾四周,发现有类似的问题,以我的一些人接受。但是我还没有找到解决方案。我使用UDP在Unix(Cygwin)中创建了一个客户端和服务器。当我尝试使用sendto()从客户端向服务器发送消息时,服务器似乎没有收到数据包。我做了错误检查,看起来客户端没有问题发送数据包,但服务器仍然无法正确接收。服务器似乎大部分已经死亡。我正在使用我的机器来托管客户端和服务器,我试图连接到我的家乡地址(127.0.0.1)和随机端口上的服务器。任何建议在这一点上将不胜感激。UDP服务器没有进入Unix(Cygwin的)

服务器代码:

#include <stdio.h> /* standard C i/o facilities */ 
#include <stdlib.h> /* needed for atoi()/atof() */ 
#include <unistd.h> /* Unix System Calls */ 
#include <sys/types.h> /* system data type definitions */ 
#include <sys/socket.h> /* socket specific definitions */ 
#include <netinet/in.h> /* INET constants and stuff */ 
#include <arpa/inet.h> /* IP address conversion stuff */ 
#include <string.h> /* String manipulation */ 
#include <time.h> /* Used to to measure process execution time */ 


/* Server main routine - this is an iterative server 

1. create a socket 
2. bind the socket and print out the port number assigned 
3. do forever 
    get next connection 
    handle the connection 
    enddo 
*/ 


int main(int argc, char **argv) 
{ 
int sockfd; 
struct sockaddr_in servaddr, cliaddr; 
int n; 

//Create UDP socket 
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
{ 
    perror("Problem creating socket\n"); 
    exit(1); 
} 

//Setup the UDP server 
bzero(&servaddr, sizeof(servaddr)); 
servaddr.sin_family = AF_INET; 
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
servaddr.sin_port = htons(0); 

//Bind the UDP to the socket 
if (bind(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr))<0) 
{ 
    perror("Error bind\n"); 
    exit(1); 
} 

//Print the port for the UDP server 
int length = sizeof(servaddr); 
if (getsockname(sockfd, (struct sockaddr *) &servaddr, &length) < 0) 
{ 
    perror("Error getsockname\n"); 
    exit(1); 
} 
printf("The Server passive socket port number is %d\n",ntohs(servaddr.sin_port)); 

//Send/Recv from client 
char msg[100]; 
for(;;) 
{ 
    socklen_t len = sizeof(cliaddr); 
    if(recvfrom(sockfd, msg, 100, 0, (struct sockaddr*) &cliaddr, &len) < 0) 
    { 
     perror("Error on recv\n"); 
     exit(1); 
    } 
    printf("Msg: %s\n", msg); 
    //read(sockfd, msg, 10); 
    //sendto(sockfd, msg, n, 0, (struct sockaddr*) &cliaddr, len); 
} 

close(sockfd); 
return 0; 
} 

客户端代码:

#include <stdio.h> /* standard C i/o facilities */ 
#include <stdlib.h> /* needed for atoi() */ 
#include <unistd.h> /* Unix System Calls */ 
#include <sys/types.h> /* system data type definitions */ 
#include <sys/socket.h> /* socket specific definitions */ 
#include <netinet/in.h> /* INET constants and stuff */ 
#include <arpa/inet.h> /* IP address conversion stuff */ 
#include <string.h> 


/* client program: 

The following must passed in on the command line: 

    name of the server (argv[1]) 
    port number of the server (argv[2]) 
*/ 

int main(int argc, char **argv) 
{ 
int sockfd; 
struct sockaddr_in servaddr; 
int n; 

//Ensure we have full args 
if (argc != 3) 
{ 
    printf("Usage: client <server name> <server port>\n"); 
    exit(1); 
} 

//Setup the port number 
bzero(&servaddr, sizeof(servaddr)); 
servaddr.sin_family = AF_INET; 
servaddr.sin_port = htons(atoi(argv[2])); 

//Setup the client IP 
//inet_pton(AF_INET, argv[1], &servaddr.sin_addr)) <= 0 
if(inet_aton(argv[1], &servaddr.sin_addr) == 0) 
{ 
    perror("Error with server IP\n"); 
    exit(1); 
} 

//Create socket 
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) 
{ 
    perror("Error on socket\n"); 
    exit(1); 
} 

/*if (connect(sockfd,(struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) 
{ 
    printf("Problem connecting socket\n"); 
    exit(1); 
}*/ 

//Send msg 

char msg[10] = "123456789"; 
for(;;) 
{ 
    socklen_t len = sizeof(servaddr); 
    if((sendto(sockfd, msg, strlen(msg), 0, (struct sockaddr*) &servaddr, len)) < 0) 
    { 
     perror("Error on sendto():\n"); 
     exit(1); 
    } 
    //write(sockfd, msg, strlen(msg)); 
    //n = recvfrom(sockfd, msg2, 10, 0, NULL, NULL); 
    //printf("Msg: %s\n", msg2); 
} 

close(sockfd); 
return 0; 
} 

回答

0

首先,你的发送者只需发送数据的速度,因为它可能可以,任何人或任何不论是否正在监听。这不是一件好事。

其次,你的接收器通过一个%s的printf说明符传递msg。但%s仅适用于C风格的字符串,而msg而不是的C风格字符串(没有在其末尾放置零字节)。您还将返回值recvfrom丢弃,因此您不能将其转换为字符串,因为您不知道有多少字节是有效的。

第三,你的服务器创建一个SOCK_STREAM插座!

+0

哇谢谢。我不敢相信我看着插座。我只是相信这是另一回事。我还考虑了您的其他提示,并且已经为他们调整了我的代码。再次感谢。 –