在C-With线程中运行客户端和服务器套接字连接



我正在尝试创建一个客户端和服务器的简单套接字连接。我按照这个指南写了一些非常基本的东西。

我正在使用客户端。c:

#include <stdio.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <unistd.h> 
#include <string.h> 
#define PORT 8080 

int client() 
{ 
int sock = 0, valread; 
struct sockaddr_in serv_addr; 
char *hello = "Hello from client"; 
char buffer[1024] = {0}; 
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
{ 
printf("n Socket creation error n"); 
return -1; 
} 

serv_addr.sin_family = AF_INET; 
serv_addr.sin_port = htons(PORT); 

// Convert IPv4 and IPv6 addresses from text to binary form 
if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0)  
{ 
printf("nInvalid address/ Address not supported n"); 
return -1; 
} 

if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) 
{ 
printf("nConnection Failed n"); 
return -1; 
} 
send(sock , hello , strlen(hello) , 0 ); 
printf("Hello message sentn"); 
valread = read( sock , buffer, 1024); 
printf("%sn",buffer ); 
return 0; 
} 

和服务器。c:

#include <unistd.h> 
#include <stdio.h> 
#include <sys/socket.h> 
#include <stdlib.h> 
#include <netinet/in.h> 
#include <string.h> 
#define PORT 8080 
int server() 
{ 
int server_fd, new_socket, valread; 
struct sockaddr_in address; 
int opt = 1; 
int addrlen = sizeof(address); 
char buffer[1024] = {0}; 
char *hello = "Hello from server"; 

// Creating socket file descriptor 
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) 
{ 
perror("socket failed"); 
exit(EXIT_FAILURE); 
} 

// Forcefully attaching socket to the port 8080 
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, 
&opt, sizeof(opt))) 
{ 
perror("setsockopt"); 
exit(EXIT_FAILURE); 
} 
address.sin_family = AF_INET; 
address.sin_addr.s_addr = INADDR_ANY; 
address.sin_port = htons( PORT ); 

// Forcefully attaching socket to the port 8080 
if (bind(server_fd, (struct sockaddr *)&address,  
sizeof(address))<0) 
{ 
perror("bind failed"); 
exit(EXIT_FAILURE); 
} 
if (listen(server_fd, 3) < 0) 
{ 
perror("listen"); 
exit(EXIT_FAILURE); 
} 
if ((new_socket = accept(server_fd, (struct sockaddr *)&address,  
(socklen_t*)&addrlen))<0) 
{ 
perror("accept"); 
exit(EXIT_FAILURE); 
} 
valread = read( new_socket , buffer, 1024); 
printf("%sn",buffer ); 
send(new_socket , hello , strlen(hello) , 0 ); 
printf("Hello message sentn"); 
return 0; 
} 

我想做的一个重要更改是从一个代码文件运行客户端和服务器,其中我使用pthread在一个线程上运行服务器,同时在另一个线程中运行客户端。

我以前使用pthreads,但是这次它不能正常工作。没有发送任何消息,看起来服务器没有在侦听。主要功能如下:

int main(){
pthread_t threads[NUM_THREADS];
int ret;
printf("In main: creating thread servern");
ret = pthread_create(&threads[0], NULL, &server, NULL);
if (ret){
printf("ERROR; return code from pthread_create() is %dn", ret);
exit(-1);
}
printf("In main: creating thread clientn");
ret = pthread_create(&threads[1], NULL, &client, NULL);
if (ret){
printf("ERROR; return code from pthread_create() is %dn", ret);
exit(-1);
}
}

其中客户端服务器功能是基本功能,与前面提到的指南中的功能完全相同。创建了线程,主函数执行时没有出现错误,但服务器和客户端函数无法正常运行。我开始怀疑套接字连接可能无法在类似线程的配置中运行。希望在这件事上能得到任何帮助。

edit:在检查服务器文件执行情况后,我注意到它在accept函数中丢失了。更具体地说,在server.c文件中:

if ((new_socket = accept(server_fd, (struct sockaddr *)&address,  
(socklen_t*)&addrlen))<0) 
{ 
perror("accept"); 
exit(EXIT_FAILURE); 
} 

它不会超过这个函数,这意味着它确实达到了"accept"函数,它进入了它的内部,但它从不离开它。它从不给new_socket分配任何值,也不进入if语句以达到perror("accept");

谢谢

根据您在评论中提供的信息,链接到@Andreas Wenzel、@encs和@IS评论:

  • 您需要等待线程完成。添加一个join函数,在其他线程运行的同时阻塞主线程
  • 在每次打印之后使用fflush((以避免与缓冲有关的问题
  • 在任何客户端尝试连接之前,服务器应处于侦听状态。为了确保这一点,请在主线程中设置服务器,并为accept((函数下面的所有内容创建pthread

最新更新