如何解决在C中运行客户端和服务器套接字连接-带线程
我正在尝试创建客户端和服务器的简单套接字连接。 我在this guide之后写了一些非常基础的文章。
我正在使用client.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 sent\n");
valread = read( sock,buffer,1024);
printf("%s\n",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,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,(socklen_t*)&addrlen))<0)
{
perror("accept");
exit(EXIT_FAILURE);
}
valread = read( new_socket,buffer );
send(new_socket,0 );
printf("Hello message sent\n");
return 0;
}
我要进行的一项重要更改是从单个代码文件运行客户端和服务器,在该文件中,我使用pthread在单个线程上运行服务器,而在另一个线程上运行客户端。
我以前使用过pthreads,但是这次它不能正常工作。没有消息正在发送,并且好像服务器没有在监听。主要功能如下:
int main(){
pthread_t threads[NUM_THREADS];
int ret;
printf("In main: creating thread server\n");
ret = pthread_create(&threads[0],NULL,&server,NULL);
if (ret){
printf("ERROR; return code from pthread_create() is %d\n",ret);
exit(-1);
}
printf("In main: creating thread client\n");
ret = pthread_create(&threads[1],&client,ret);
exit(-1);
}
}
客户端和服务器功能是基本功能,与前面提到的指南完全相同。 创建线程,并且主函数执行没有错误,但是服务器和客户端函数无法正常运行。我开始怀疑套接字连接可能无法在类似线程的配置中运行。希望能在此问题上提供任何帮助。
修改:
检查服务器文件执行后,我发现它在accept
函数中丢失了。更具体地说,在server.c文件中:
if ((new_socket = accept(server_fd,(socklen_t*)&addrlen))<0)
{
perror("accept");
exit(EXIT_FAILURE);
}
它不会超越此功能,这意味着它确实达到了“接受”功能,并且进入了它的内部,但从未离开过它。它永远不会为new_socket
分配任何值,也不会放入if语句中以击中perror("accept");
谢谢
解决方法
根据您在评论中提供的信息,并与@Andreas Wenzel,@ encs和@IS评论链接:
- 您需要等待线程完成。添加一个join函数来阻塞主线程,同时其他线程正在运行
- 在每个printf()之后使用fflush()以避免与缓冲相关的问题
- 在任何客户端尝试连接之前,服务器应处于 状态。为了确保这一点,请在主线程中设置服务器,然后为accept()函数下面的所有内容创建一个pthread。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。