gpt4 book ai didi

c - C中的多线程客户端-服务器套接字编程

转载 作者:可可西里 更新时间:2023-11-01 02:49:46 24 4
gpt4 key购买 nike

我正在同一台机器上用 C 语言实现多线程客户端-服务器套接字编程,该机器具有相同的 IP 地址,但客户端和服务器的端口不同。我在 C 环境中使用 pthread 概念实现了它。但是我只能看到我的客户端线程正在运行,而我的服务器线程一旦到达“accept()”例程就停止了。我想知道可能是什么问题。如果有人能找出我在哪里犯了错误,那将非常有帮助

我的客户端代码如下所示:

void *client_connect(void *arg)
{

int client_socket;
struct sockaddr_in Serv_Addr;
struct sockaddr_in Client_Addr;
int addrlen=sizeof(Client_Addr);

char send_buffer_client[] = {"server message"};
char recv_buffer_client[1024];
int nbytes;

client_socket = lwip_socket(AF_INET, SOCK_STREAM, 0);
if (client_socket < 0) ;

memset((char *)&Serv_Addr, 0, sizeof(Serv_Addr));
Serv_Addr.sin_family = AF_INET;
Serv_Addr.sin_len = sizeof(Serv_Addr);
Serv_Addr.sin_addr.s_addr = inet_addr("1.2.3.4");
Serv_Addr.sin_port = 9999;
memset((char *)&Client_Addr, 0, sizeof(Client_Addr));
Client_Addr.sin_family = AF_INET;
Client_Addr.sin_len = sizeof(Client_Addr);
Client_Addr.sin_addr.s_addr = inet_addr("1.2.3.4");
Client_Addr.sin_port = 5555;

lwip_connect(client_socket, (struct sockaddr *)&Serv_Addr, sizeof(Serv_Addr));

while (1) {

do{
nbytes = lwip_recv(client_socket, recv_buffer_client, sizeof(recv_buffer_client),0);
if (nbytes>0) lwip_send(client_socket, send_buffer_client, sizeof(send_buffer_client), 0);

printf("server message = %s\n", recv_buffer_client);
} while (nbytes>0);

sleep(10);

}
lwip_close(client_socket);
}

我的服务器代码:

void *server_connect(void *arg)
{

int server_socket;
struct sockaddr_in Serv_Addr;
struct sockaddr_in Client_Addr;
int addrlen=sizeof(Client_Addr);
int clientfd;
char send_buffer[] = {"Server message"};
char recv_buffer[1024];
int nbytes_server, client_length;

server_socket = lwip_socket(AF_INET, SOCK_STREAM, 0);
if (server_socket < 0)
printf("could not create server socket");
else
printf("created SERVER socket");

memset((char *)&Serv_Addr, 0, sizeof(Serv_Addr));
Serv_Addr.sin_family = AF_INET;
Serv_Addr.sin_len = sizeof(Serv_Addr);
Serv_Addr.sin_addr.s_addr = inet_addr("1.2.3.4");
Serv_Addr.sin_port = 9999;


client_length = sizeof(Client_Addr);
if (lwip_bind(server_socket, (struct sockaddr *)&Serv_Addr, sizeof(Serv_Addr)) < 0) {
printf("could not BIND");
}

if ( lwip_listen(server_socket, 20) != 0 ){
printf("could not BIND");
}
while (1) {
lwip_accept(server_socket, (struct sockaddr*)&Client_Addr, &client_length);

do{
nbytes_server = lwip_recv(server_socket, recv_buffer, sizeof(recv_buffer),0);
if (nbytes_server>0){lwip_send(server_socket, send_buffer, sizeof(send_buffer), 0);}

printf("client message = %s\n", recv_buffer);
}while(nbytes_server>0);
sleepms(10);
}
lwip_close(server_socket);
}

void main(void)
{
pthread_t client_thread;
pthread_t server_thread;

pthread_create(&server_thread, NULL, server_connect, NULL);
pthread_create(&client_thread, NULL, client_connect, NULL);

while(1){
sleepms(1);
}
}

如果我做错了,请告诉我

问候黛布

最佳答案

这里至少有 3 个错误:

lwip_accept() 返回一个新的套接字描述符,您应该使用它从客户端读取,而不是从原始服务器套接字读取(另请注意,lwip_accept 将阻塞,直到有人实际连接到服务器)。

如果你在小端机器上,你的端口号也可能关闭,它们通常是网络字节顺序,你应该这样做Serv_Addr.sin_port = htons(9999); 客户端端口相同 - htons将 short 从主机字节序转换为网络字节序

您没有发送任何数据!您的客户端等待服务器向其发送内容。但是你的服务器不发送任何东西,它等待客户端发送一些东西。什么都不会发生。

检查 lwip_connect 是否也失败,并检查 errno如果您的环境提供了它,因为它可能会提供出错的线索

关于c - C中的多线程客户端-服务器套接字编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5885203/

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