我在同一台机器上使用相同的IP地址在C中实现多线程客户端 - 服务器套接字编程,但客户端和服务器端口不同。我在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);
}
}
如果我做错了,请告诉我
此致 DEB
答案 0 :(得分:2)
这是至少3个错误:
lwip_accept()返回一个新的套接字描述符,您应该使用它来从客户端读取,而不是从原始服务器套接字读取(另请注意,lwip_accept将阻塞,直到某人实际连接到服务器)。
如果您使用的是小端机器,您的端口号也可能已关闭,它们通常处于网络字节顺序,您应该这样做
Serv_Addr.sin_port = htons(9999);
和客户端端口相同 - htons将短路由主机端转换为网络端
您没有发送任何数据!您的客户端等待服务器发送一些东西。但是你的服务器没有发送任何东西,它等待客户端发送一些东西。什么都不会发生。
检查lwip_connect是否也失败,如果您的环境提供它,请检查errno,因为它可能会提供出错的线索
答案 1 :(得分:0)
如果您在同一台计算机上,则您使用的IP地址1.2.3.4不是localhost的典型地址,应该是127.0.0.1。除非您实际使用路由器或其他方式使用IP地址1.2.3.4来设置机器的IP地址,否则该地址将无法解析,即使您尝试在同一台计算机上运行客户端和服务器,他们不会找到对方,因为无法将1.2.3.4解析为网络上的给定机器。
此外,您不需要将服务器锁定到特定的IP地址,您只需使用INADDR_ANY
中的常量netinet/in.h
,它将套接字绑定到系统上的任何接口。在客户端虽然你仍然需要正确的IP地址,但是如果它是localhost,你可以只使用127.0.0.1。
答案 2 :(得分:0)
(1)看起来好像客户端和服务器都在等待收到回复之前收到的东西。有人必须先说话。
(2)我没有看到你的lwip_accept返回一个与客户端通信的新套接字。你最终在侦听套接字上进行recv / send。
(3)还要考虑你的代码:
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);
}
你读取并回显一条消息,但从不关闭套接字(可能是明智的,因为它是监听套接字!)并立即循环回阻塞再次接受。如果客户端没有再次连接,您将永久阻止该接受。
(4)你不需要那些sleepms()调用。在main中使用pthread_join(),然后摆脱其余部分。无论如何,看起来你的所有电话都会阻止。