gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:50:58 28 4
gpt4 key购买 nike

我正在尝试创建客户端和服务器的简单套接字连接。
我在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;
}
和server.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("%s\n",buffer );
send(new_socket , hello , strlen(hello) , 0 );
printf("Hello message sent\n");
return 0;
}
我要进行的一项重要更改是从单个代码文件运行客户端和服务器,在该文件中,我使用pthread在单个线程上运行服务器,而在另一个线程上运行客户端。
我以前使用过pthread,但是这次无法正常工作。没有消息正在发送,并且好像服务器没有在监听。主要功能如下所示:
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], NULL, &client, NULL);
if (ret){
printf("ERROR; return code from pthread_create() is %d\n", ret);
exit(-1);
}
}
其中 客户端服务器功能是基本功能,与前面提到的指南完全相同。
创建线程,并且主函数执行没有错误,但是服务器和客户端函数无法正常运行。我开始怀疑套接字连接可能无法在类似线程的配置中运行。希望在此问题上有任何帮助。
编辑:
检查服务器文件执行后,我注意到它在 accept函数中丢失了。更具体地说,在server.c文件中:
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address,  
(socklen_t*)&addrlen))<0)
{
perror("accept");
exit(EXIT_FAILURE);
}
它不会超越此功能,这意味着它确实达到了“接受”功能,并且进入了它的内部,但它从未离开过它。它永远不会为 new_socket分配任何值,也不会进入if语句中以击打 perror("accept");谢谢

最佳答案

根据您在评论中提供的信息,这些信息与@Andreas Wenzel,@ encs和@IS评论相关联:

  • 您需要等待线程完成。在其他线程运行
  • 的同时添加一个join函数来阻塞主线程
  • 在每个printf()之后使用fflush()以避免与缓冲
  • 有关的问题
  • 在任何客户端尝试连接之前,服务器应处于“监听”状态。为了确保这一点,请在主线程中设置服务器,并为accept()函数下面的所有内容创建一个pthread。
  • 关于c - 在C中运行客户端和服务器套接字连接-带线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63488369/

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