我正在尝试创建一个客户端和服务器的简单套接字连接。我按照这个指南写了一些非常基本的东西。
我正在使用客户端。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