gpt4 book ai didi

c - 编写我的 Server.c 套接字维护多线程的问题

转载 作者:太空宇宙 更新时间:2023-11-04 03:09:11 24 4
gpt4 key购买 nike

正如标题所说,我正在创建一个服务器/客户端连接。服务器将允许多个客户端,而客户端可以与服务器通信。我有服务器和客户端文件。我不确定哪里出错了。

我在cygwin中执行每一行

gcc server.c -o server lpthread
crashes :(

gcc client.c -o client
./client localhost 8080

服务器.c

#include <stdio.h>
#include <stdlib.h> // for IOs
#include <string.h>
#include <unistd.h>
#include <sys/types.h> // for system calls
#include <sys/socket.h> // for sockets
#include <netinet/in.h> // for internet
#include <stdbool.h>
#include <pthread.h> // for thread;

/* a function to print out error message and then abort */
void error(const char *msg) {
perror(msg);
exit(1);
}

void *threadFunct(int mySockfd) {
char buffer2[256];
bool exitFlag = false;
int read_writeLen;
while(!exitFlag) {
bzero(buffer2, 256);
read_writeLen = read(mySockfd, buffer2, 255);
if (read_writeLen < 0)
printf("ERROR reading from the client socket\n");

if(strcmp(buffer2,"EXIT\n")==0) {
printf("Now socket %d will be close\n", mySockfd);
close(mySockfd);
pthread_exit(mySockfd); // terminate the calling thread

} else {
printf("The message read from socket %d :%s\n ",mySockfd,buffer2);
read_writeLen = write(mySockfd,"I got Your Message" , 18);
if (read_writeLen < 0)
printf("Unable to write to socket\n");
}
}
close(mySockfd);
return NULL;

}
int main(int argc, char *argv[]) {
int sockfd, newsockfd, portno;
socklen_t clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int charRead_Written;
if(argc <2) {
fprintf(stderr, "ERROR, no port provided\n");
exit(1);
}

sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
error("ERROR Opening socket");

bzero((char *) &serv_addr, sizeof(serv_addr));
portno = atoi(argv[1]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);

if(bind(sockfd,(struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
error("ERROR on binding");


while(true) {
pthread_t threadId;

listen(sockfd,10);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if(newsockfd<0)
error("ERROR on accept");
pthread_create(&threadId,NULL,threadFunct,newsockfd);
}

close(sockfd);
return 0;
}

客户端.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <stdbool.h>

void error(const char *msg) {
perror(msg);
exit(0);
}

int main(int argc, char *argv[]) {
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;
bool running = false; // Keep running until the user types EXIT

// gcc client.c -o client
// ./client localhost port
char buffer[256];
if (argc <3) {
fprintf(stderr, "usage %s hostname port\n", argv[0]);
exit(0);
}
portno = atoi(argv[2]);
sockfd = socket(AF_INET, SOCK_STREAM, 0);

if(sockfd <0)
error("ERROR opening socket");


server = gethostbyname(argv[1]);
if (server == NULL) {
fprintf(stderr, "ERROR , no such host \n");
exit(0);
}

bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *) server->h_addr, (char *) &serv_addr.sin_addr.s_addr, server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) <0)
error("ERROR Connecting");
while(!running) {
printf("Please Enter The message: ");
bzero(buffer, 256);
fgets(buffer, 255, stdin);
n = write(sockfd, buffer, strlen(buffer));
if(n<0)
error("ERROR writing from socket");

if(strcmp(buffer, "EXIT\n")== 0)
{
running = true;
break;
}
bzero(buffer,256);
n = read(sockfd, buffer,255);
if(n < 0)
printf("ERROR reading from socket");
printf("%s\n", buffer);

}
close(sockfd);

return 0;
}

client.c 文件编译并工作正常。 server.c 文件无法编译并且不确定如何解决这些问题。下面发布了 server.c 的编译结果。

server.c: In function ‘threadFunct’:
server.c:39:17: warning: passing argument 1 of ‘pthread_exit’ makes pointer from integer without a cast [-Wint-conversion]
pthread_exit(mySockfd); // terminate the calling thread
^~~~~~~~
In file included from server.c:18:0:
/usr/include/pthread.h:150:6: note: expected ‘void *’ but argument is of type ‘int’
void pthread_exit (void *) __attribute__ ((__noreturn__));
^~~~~~~~~~~~
server.c: In function ‘main’:
server.c:85:36: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [-Wincompatible-pointer-types]
pthread_create(&threadId,NULL,threadFunct,newsockfd);
^~~~~~~~~~~
In file included from server.c:18:0:
/usr/include/pthread.h:146:5: note: expected ‘void * (*)(void *)’ but argument is of type ‘void * (*)(int)’
int pthread_create (pthread_t *, const pthread_attr_t *,
^~~~~~~~~~~~~~
server.c:85:48: warning: passing argument 4 of ‘pthread_create’ makes pointer from integer without a cast [-Wint-conversion]
pthread_create(&threadId,NULL,threadFunct,newsockfd);
^~~~~~~~~
In file included from server.c:18:0:
/usr/include/pthread.h:146:5: note: expected ‘void *’ but argument is of type ‘int’
int pthread_create (pthread_t *, const pthread_attr_t *,

最佳答案

取而代之的是:

pthread_exit(mySockfd);     // terminate the calling thread

这个:

pthread_exit(NULL);     // terminate the calling thread

取而代之的是:

void *threadFunct(int mySockfd)

这个:

struct MyArgs
{
int mySockfd;
};

void *threadFunct(void* args)
{
int mySockfd = ((struct MyArgs*)args)->mySockfd;

然后创建线程如下:

 struct MyArgs* args = (struct MyArgs*)malloc(sizeof(struct MyArgs));
args->mySockfd = mySockfd;
pthread_create(&threadId,NULL,threadFunct,(void*)args);

在线程退出或即将退出时,您需要自行在该分配结构上正确调用 free

关于c - 编写我的 Server.c 套接字维护多线程的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58313826/

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