当前位置: 技术问答>linux和unix
关于Linux下socket编程的问题
来源: 互联网 发布时间:2015-12-11
本文导语: 一共2个线程,第二线程调用pthread_cond_wait进行等待, 主线程accept后调用pthread_cond_signal,唤醒第二线程, 并把相应的connectionid传给第二线程,由第二线程read, 但是read返回-1,为什么? 我调了很长时间都不行,把read操作...
一共2个线程,第二线程调用pthread_cond_wait进行等待,
主线程accept后调用pthread_cond_signal,唤醒第二线程,
并把相应的connectionid传给第二线程,由第二线程read,
但是read返回-1,为什么?
我调了很长时间都不行,把read操作放到主线程就没有问题。
附代码:
//server.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "server.h"
int main()
{
struct sockaddr_in socket_address;
int rval;
struct sigaction sigchld_action;
int server_socket;
/* Create a TCP socket. */
server_socket = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (server_socket == -1)
printf ("socket");
memset (&socket_address, 0, sizeof (socket_address));
socket_address.sin_family = AF_INET;
socket_address.sin_port = htons(82);
socket_address.sin_addr.s_addr = htonl(INADDR_ANY);
/* Bind the socket to that address. */
rval = bind (server_socket, (struct sockaddr*)&socket_address, sizeof (socket_address));
if (rval != 0)
printf ("bind");
/* Instruct the socket to accept connections. */
rval = listen (server_socket, 50);
if (rval != 0)
printf("listen");
if (serverinit())
{
printf("serverinit failsn");
exit(1);
}
char strsend[12];
char buf[12];
/* Loop forever, handling connections. */
while (1)
{
int connection;
int len = sizeof(socket_address);
memset(strsend,0,12);
memset(buf,0,12);
/* Accept a connection. This call blocks until a connection is
ready. */
printf("server:stoppedn");
connection = accept (server_socket, (struct sockaddr*)&socket_address, &len);
if (connection next = head;
head = list;
}
}
int myListDel()
{
myList* list = head;
for (;list;list = list->next)
{
if (list->isValid)
{
list->isValid = 0;
return list->connid;
}
}
return 0;
}
void myListAdd(int connid)
{
myList *list = head;
for (;list;list = list->next)
{
if (list->isValid == 0)
{ list->connid = connid;
list->isValid = 1;
break;
}
}
}
void *thrmgr_worker(void *arg)
{
char buf[12];
/* loop looking for work */
for (;;)
{
if (pthread_mutex_lock(&pool_mutex) != 0)
{
printf("!Fatal: mutex lock failedn");
exit(-2);
}
memset(buf,0,12);
pthread_cond_wait(&pool_cond,&pool_mutex);
int connid = myListDel();
printf("In the thread %d bytes readn",read(connid,buf,8));
//注意,为什么此处read返回-1!!
if (pthread_mutex_unlock(&pool_mutex) != 0)
{
printf("!Fatal: mutex unlock failedn");
exit(-2);
}
}
return NULL;
}
int serverinit()
{
myList* list = NULL;
head = (myList*)malloc(sizeof(myList));
if(head == NULL)
{
return 1;
}
memset (head,0,sizeof(myList));
int i = 1;
for (;iisValid = 0;
add(list);
}
if (pthread_create(&(head->tid), NULL,thrmgr_worker, NULL) != 0)
{
printf("!pthread_create failedn");
return 1;
}
return 0;
}
#endif
//client.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main()
{
int sockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in serveraddr;
bzero(&serveraddr,sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(82);
serveraddr.sin_addr.s_addr = inet_addr("192.168.0.1");
int ret = connect(sockfd,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr_in));
if (ret
主线程accept后调用pthread_cond_signal,唤醒第二线程,
并把相应的connectionid传给第二线程,由第二线程read,
但是read返回-1,为什么?
我调了很长时间都不行,把read操作放到主线程就没有问题。
附代码:
//server.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "server.h"
int main()
{
struct sockaddr_in socket_address;
int rval;
struct sigaction sigchld_action;
int server_socket;
/* Create a TCP socket. */
server_socket = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (server_socket == -1)
printf ("socket");
memset (&socket_address, 0, sizeof (socket_address));
socket_address.sin_family = AF_INET;
socket_address.sin_port = htons(82);
socket_address.sin_addr.s_addr = htonl(INADDR_ANY);
/* Bind the socket to that address. */
rval = bind (server_socket, (struct sockaddr*)&socket_address, sizeof (socket_address));
if (rval != 0)
printf ("bind");
/* Instruct the socket to accept connections. */
rval = listen (server_socket, 50);
if (rval != 0)
printf("listen");
if (serverinit())
{
printf("serverinit failsn");
exit(1);
}
char strsend[12];
char buf[12];
/* Loop forever, handling connections. */
while (1)
{
int connection;
int len = sizeof(socket_address);
memset(strsend,0,12);
memset(buf,0,12);
/* Accept a connection. This call blocks until a connection is
ready. */
printf("server:stoppedn");
connection = accept (server_socket, (struct sockaddr*)&socket_address, &len);
if (connection next = head;
head = list;
}
}
int myListDel()
{
myList* list = head;
for (;list;list = list->next)
{
if (list->isValid)
{
list->isValid = 0;
return list->connid;
}
}
return 0;
}
void myListAdd(int connid)
{
myList *list = head;
for (;list;list = list->next)
{
if (list->isValid == 0)
{ list->connid = connid;
list->isValid = 1;
break;
}
}
}
void *thrmgr_worker(void *arg)
{
char buf[12];
/* loop looking for work */
for (;;)
{
if (pthread_mutex_lock(&pool_mutex) != 0)
{
printf("!Fatal: mutex lock failedn");
exit(-2);
}
memset(buf,0,12);
pthread_cond_wait(&pool_cond,&pool_mutex);
int connid = myListDel();
printf("In the thread %d bytes readn",read(connid,buf,8));
//注意,为什么此处read返回-1!!
if (pthread_mutex_unlock(&pool_mutex) != 0)
{
printf("!Fatal: mutex unlock failedn");
exit(-2);
}
}
return NULL;
}
int serverinit()
{
myList* list = NULL;
head = (myList*)malloc(sizeof(myList));
if(head == NULL)
{
return 1;
}
memset (head,0,sizeof(myList));
int i = 1;
for (;iisValid = 0;
add(list);
}
if (pthread_create(&(head->tid), NULL,thrmgr_worker, NULL) != 0)
{
printf("!pthread_create failedn");
return 1;
}
return 0;
}
#endif
//client.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main()
{
int sockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in serveraddr;
bzero(&serveraddr,sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(82);
serveraddr.sin_addr.s_addr = inet_addr("192.168.0.1");
int ret = connect(sockfd,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr_in));
if (ret