客户端代码
#include <stdio.h>
#include <stdlib.h>
/*
#include <modes.h>
#include <events.h>
#include <process.h>
#include <alarm.h>
#include <signal.h>
#include <module.h>
#include <sg_codes.h>
#include <sgstat.h>
#include <sys/types.h>
*/
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <string.h>
#include <time.h>
#define MAX 1024
int main ( int argc, char ** argv)
{
printf("Check point 1\n");
if (argc != 2)
{
printf("Error!! Provide a correct port\n");
exit (0);
}
unsigned char buff[MAX];
int port = atoi(argv[1]);
int sockfd;
struct sockaddr_in myAddr, Addr;
unsigned char temp[MAX];
char buffer [MAX];
socklen_t addr_size;
addr_size = sizeof(Addr);
//_os_getime();
printf("Check point 2\n");
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0))< 0)
{
printf ( "%d", sockfd);
perror("socket failed");
exit(EXIT_FAILURE);
}
memset(&myAddr,'\0', sizeof(myAddr));
myAddr.sin_family = AF_INET;
myAddr.sin_port = htons(port);
myAddr.sin_addr.s_addr =inet_addr("127.0.0.1");
printf ("Check point 3");
strcpy(buff, "ABCDE\n");
if((sendto(sockfd, buff, MAX, 0 , (struct sockaddr*) &myAddr, sizeof(myAddr)))<0)
{
perror("Sending failed--");
exit(EXIT_FAILURE);
}
printf ("Check point 4");
if((recvfrom(sockfd, buffer, sizeof(buffer), 0 , (struct sockaddr*) &Addr, &addr_size))<0)
{
perror("Receiving failed");
exit(EXIT_FAILURE);
}
printf ( "%s", buff);
close(sockfd);
return 0;
}
服务器代码
#include <stdio.h>
#include <stdlib.h>
/*
#include <modes.h>
#include <events.h>
#include <process.h>
#include <alarm.h>
#include <signal.h>
#include <module.h>
#include <sg_codes.h>
#include <sgstat.h>
#include <sys/types.h>
*/
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <string.h>
#include <time.h>
#define MAX 1024
int main (int argc, char ** argv)
{
if (argc != 2)
{
printf("Error!! Provide a correct port\n");
exit (0);
}
int port = atoi(argv[1]);
char buff[MAX];
char buffer [MAX];
int sockfd, clientfd;
struct sockaddr_in myAddr, Addr;
socklen_t addr_size;
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0))< 0)
{
printf ( "%d", sockfd);
perror("socket failed");
exit(EXIT_FAILURE);
}
memset(&myAddr,'\0', sizeof(myAddr));
myAddr.sin_family = AF_INET;
myAddr.sin_port = htons(port);
myAddr.sin_addr.s_addr =inet_addr("127.0.0.1");
if ((bind (sockfd, (struct sockaddr*) &myAddr, sizeof(myAddr)))<0)
{
perror("Binding failed");
exit(EXIT_FAILURE);
}
addr_size = sizeof(Addr);
int recv = recvfrom(sockfd, buff, MAX, 0 , (struct sockaddr*) &Addr, &addr_size);
printf ( "%s", buff);
strcpy(buffer, "EFGH");
if((sendto(sockfd, buffer, MAX, 0 , (struct sockaddr*) &myAddr, sizeof(myAddr)))<0)
{
perror("Sending failed");
exit(EXIT_FAILURE);
}
close(sockfd);
return 0;
}
我已编辑了我的问题, 这次我编写了一个没有任何结构的简单代码,并添加了错误检查。 当我启动服务器然后启动客户端时,消息ABCDE被发送到服务器并且消息将在服务器上打印并且服务器将被终止。 但是在客户端,代码不会被终止并且只能执行到检查点2.我不理解我的至少检查点3即使下一行正在工作也没有打印。 当然,从服务器到客户端的消息也没有打印出来
答案 0 :(得分:1)
您必须使用相同的套接字客户端。当您将第一个数据包发送到服务器时,它会收到任意地址。服务器知道该地址,因为它从调用recvfrom
获取它并使用它发送自己的数据包。
这意味着在客户端,数据包是在绑定到该地址的套接字上接收的,即用于发送第一个数据包的套接字。当您尝试从不同的套接字读取时,您永远不会读取该数据包。
正如Someprogrammerdude在评论中所说,客户端和服务器中的数据包大小不匹配。
因此在client.c中更改2行足以解决问题:
#define MAX 500
和
int rec_size = recvfrom(sockfd, &recv, sizeof(frame), 0 ,
(struct sockaddr*) &Addr, &addr_size);
但是这里仍然存在很多问题,因为您还应该使用一个单一的套接字服务器端并添加错误检查。