C 线程函数内部的Wierd行为
我有一个用C编写的服务器程序,带有一个线程函数join\ U处理程序。当我在main中调用此函数时,在语句--C 线程函数内部的Wierd行为,c,multithreading,network-programming,C,Multithreading,Network Programming,我有一个用C编写的服务器程序,带有一个线程函数join\ U处理程序。当我在main中调用此函数时,在语句--printf(“内部连接处理程序%d”,newsock)之后不执行任何操作在线程函数内执行 #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<netdb.h> #include<str
printf(“内部连接处理程序%d”,newsock)之后不执行任何操作代码>在线程函数内执行
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<string.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<pthread.h>
#define SERVER_PORT 5498
#define MAX_LINE 256
#define MAX_PENDING 5
#define MAXNAME 256
int req_no;
char packet_type[50];
//void* join_handler(struct*);
struct packet{
short type;
char data[MAXNAME];
};
struct packet packet_reg;
struct global_table{
int sockid;
int reqno;
};
struct global_table record[20];
void *join_handler(void *rec)
{
//pthread_mutex_t my_mutex= PTHREAD_MUTEX_INITIALIZER;
int *newsock;
newsock=(int*)rec;
printf("inside join handler %d",newsock); /// the last statement which gets executed
printf("\n %d",newsock);
if(recv(newsock,&packet_reg,sizeof(packet_reg),0)<0)
{
printf("\n Could not receive \n");
exit(1);
}
printf("\n joinhandler sockid is %d",newsock);
//other operation
pthread_exit(NULL);
}
int main(int argc, char* argv[])
{
pthread_t threads[2];
struct sockaddr_in sin;
struct sockaddr_in clientAddr;
char buf[MAX_LINE];
int s, new_s;
struct in_addr addr;
struct hostent *host;
int len;
struct registrationTable
{
int port;
char name[MAXNAME];
int req_no;
};
struct registrationTable table[10];
int *exit_value;
req_no=0;
char clientname[500];
/* setup passive open */
if((s = socket(PF_INET, SOCK_STREAM, 0)) < 0){
perror("tcpserver: socket");
exit(1);
}
/* build address data structure */
bzero((char*)&sin, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(SERVER_PORT);
if(bind(s,(struct sockaddr *)&sin, sizeof(sin)) < 0){
perror("tcpclient: bind");
exit(1);
}
listen(s, MAX_PENDING);
/* wait for connection, then receive and print text */
while(1){
if((new_s = accept(s, (struct sockaddr *)&clientAddr, &len)) < 0){
perror("tcpserver: accept");
exit(1);
}
recv(new_s,&packet_reg, sizeof(packet_reg), 0);
if(recv(new_s,&packet_reg, sizeof(packet_reg), 0)<0)
{
printf("\n Could not receive first registration packet \n");
exit(1);
}
pthread_create(&threads[0],NULL,join_handler,new_s);
pthread_join(threads[0],&exit_value);
}
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义服务器端口5498
#定义最大值第256行
#定义最大挂起5
#定义MAXNAME 256
内部要求编号;
字符包_类型[50];
//void*连接处理程序(struct*);
结构包{
短型;
字符数据[MAXNAME];
};
结构数据包\u reg;
结构全局表{
int-sockid;
国际需求编号;
};
结构全局_表记录[20];
void*join\u处理程序(void*rec)
{
//pthread\u mutex\u t my\u mutex=pthread\u mutex\u初始值设定项;
国际*新闻股;
newsock=(int*)rec;
printf(“在连接处理程序%d内部”,newsock);///执行的最后一条语句
printf(“\n%d”,新闻组);
如果(recv(newsock,&packet\u reg,sizeof(packet\u reg),0)您将在a\n之前不会看到任何输出。
因此,您不会看到执行这一行:
printf("\n %d",newsock);
这并不意味着它没有执行,只是输出被缓冲了,在recv接收到某些内容之前,您不会看到它。但是,我猜,在您将某些内容发送回客户端之前,不会看到它,因为您在启动线程之前读取了第一个数据包。将类型错误的数据传递到printf()
调用未定义的行为:%d
需要int
,但是您传递了int*
您可以在调用printf()
后使用fflush(stdout);
强制传递给printf()的内容
可以打印。使用调试器也很好。启用编译器警告。如果编译器没有警告将int*
传递给recv()
,请获取真正的编译器。