[英]String with thread in tcp client / server in C
我正在嘗試用C開發一個應用程序來接收消息並用TCP發送它。 為此,我使用了2個線程:要監聽的服務器線程和發送它的客戶端線程。
這里的服務器和主要功能:
void dostuff(int sock)
{
int n;
char buffer[256];
bzero(buffer,256);
n = read(sock,buffer,255);
if (n < 0) error("ERROR reading from socket");
else {
pthread_t t_tcp_client;
pthread_create(&t_tcp_client, NULL, tcp_client, buffer);
}
n = write(sock,"Message received",18);
if (n < 0) error("ERROR writing to socket");
}
static void *tcp_server(void *p_data)
{
int sockfd, newsockfd, pid;
socklen_t clilen;
struct sockaddr_in serv_addr, cli_addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) error("ERROR opening socket");
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(TCP_PORT);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) error("ERROR on binding");
listen(sockfd,5);
clilen = sizeof(cli_addr);
while (1) {
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0) error("ERROR on accept");
pid = fork();
if (pid < 0) error("ERROR on fork");
if (pid == 0) {
close(sockfd);
dostuff(newsockfd);
exit(0);
} else {
close(newsockfd);
}
}
close(sockfd);
return 0;
}
int main (void)
{
pthread_t t_tcp_server;
pthread_create(&t_tcp_server, NULL, tcp_server, NULL);
pthread_join(t_tcp_server, NULL);
return 0;
}
和客戶端線程:
static void *tcp_client(void *p_data)
{
if (p_data != NULL)
{
char const *message = p_data;
printf("Message transmitted : %s\n", message);
}
return 0;
}
問題是客戶端線程沒有收到好的char,結果是:
消息傳遞:???〜?
我認為這個問題來自於:n = read(sock,buffer,255); 但我真的不明白為什么。
謝謝您的幫助
do_stuff
很可能在客戶端線程完成它之前退出。
客戶端線程使用堆棧分配的內存,當do_stuff
退出時,該內存已被釋放,並將被其他一些代碼重用。
解決方案是將堆分配的內存傳遞給客戶端。 如果動態分配后者則需要在客戶端完成其工作后釋放。
static char buffer[256];
void dostuff(int sock)
{
int n;
bzero(buffer,256);
n = read(sock,buffer,255);
...
}
使用套接字時要小心,一次讀取可能無法提供您等待的消息的全部內容。
對於結構化消息,您定義的協議(您應該很好地定義它)必須首先給出一個消息標識符,並且在您收到sizeof(theSpecificMessage)之前進行讀取,並且標識符標識特定消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.