C 线程函数内部的Wierd行为

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

我有一个用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<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()
,请获取真正的编译器。