gpt4 book ai didi

c - 在套接字编程中消息未从服务器发送到客户端

转载 作者:行者123 更新时间:2023-11-30 14:51:05 24 4
gpt4 key购买 nike

客户端代码

  #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 也没有被打印。当然,从服务器到客户端的消息也没有被打印

最佳答案

您必须使用相同的套接字客户端。当您向服务器发送第一个数据包时,它会收到任意地址。服务器知道该地址,因为它从对 recvfrom 的调用中获取该地址,并使用它发送自己的数据包。

这意味着在客户端,数据包是在绑定(bind)到该地址的套接字上接收的,即用于发送第一个数据包的地址。当您尝试从不同的套接字读取数据时,您永远不会读取数据包。

正如 Someprogrammerdude 在其评论中所说,客户端和服务器中的数据包大小不匹配。

因此更改 client.c 中的 2 行足以解决问题:

#define     MAX 500

        int  rec_size = recvfrom(sockfd, &recv, sizeof(frame), 0 ,
(struct sockaddr*) &Addr, &addr_size);

但是这里仍然存在很多问题,因为您还应该使用一个单套接字服务器端并添加错误检查。

关于c - 在套接字编程中消息未从服务器发送到客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48564918/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com