69,373
社区成员
发帖
与我相关
我的任务
分享
void* ClientFunc(void * param)
{
int cli_sock = -1;
int flags = -1;
cli_sock = socket(AF_INET, SOCK_STREAM, 0);
if( cli_sock < 0 )
{
perror("socket");
return NULL;
}
struct sockaddr_in clientaddr;
memset(&clientaddr, 0, sizeof(sockaddr_in));
clientaddr.sin_family = AF_INET;
clientaddr.sin_addr.s_addr = inet_addr("172.18.116.133");
clientaddr.sin_port = htons(9999);
if( connect(cli_sock, (struct sockaddr *)&clientaddr, sizeof(sockaddr_in)) < 0 )
{
perror("connect");
return NULL;
}
flags = fcntl(cli_sock, F_GETFL, 0);
fcntl(cli_sock, F_SETFL, flags|O_NONBLOCK);
fd_set rset, wset;
struct timeval tval;
FD_ZERO(&rset);
FD_SET(cli_sock, &rset);
wset = rset;
tval.tv_sec = 10;
tval.tv_usec = 0;
if ( select(cli_sock + 1, &rset, &wset, NULL, &tval) < 0 )
{
printf("\n[%s]-[%d]: selec failed !", __func__, __LINE__);
return NULL;
}
char buf[1024] = {0};
char sendMsg[512] = {0};
int writelen = 0;
int readlen = 0;
while(1)
{
readlen = read(cli_sock, buf, sizeof(buf));
printf(" sever:%s\n", buf);
writelen = write(cli_sock, "Hello sever!", 1024);
}
}
while(1)
{
//用select()函数进行accept是否有客户端连接到来的轮询,否则程序会可能一直在这里阻塞,
//当没有客户端到来的时候,用户层不能进行处理
FD_ZERO(&fd_r);
FD_ZERO(&fd_w);
FD_SET(ser_sock, &fd_r);
FD_SET(ser_sock, &fd_w);
tvv.tv_sec = 2;
tvv.tv_usec = 0;
Ret = select(ser_sock + 1, &fd_r, &fd_w, NULL, &tvv);
printf("\n [%s]-[%d]: Ret = %d \n", __func__, __LINE__, Ret);
switch( Ret )
{
case -1:
case 0:
continue;
default:
break;
}
///accept 返回每个不同客户端的socket
cli_sock = accept(ser_sock, (struct sockaddr *)& clieaddr_in, &socklen);
if( cli_sock < 0 )
{
perror("accept");
return -1;
}
m_ClientNum ++;
//连接上的的某一个客户端信息的交互
char buf[1024] = {0};
sprintf(buf, "Hello client[%d], thanks for you come in!", m_ClientNum);
write(cli_sock, buf, 1024);
pthread_t pthreadId;
pthread_t clientpthreadId;
PThreadParam* stThread = new PThreadParam;
stThread->sockfd = cli_sock;
// pthread_create(&pthreadId, NULL, &serverwrite, (void*)stThread);
//测试客户端线程函数
pthread_create(&clientpthreadId, NULL, &ClientFunc, NULL);
while(1)
{
read(cli_sock, buf, sizeof(buf));
printf(" client:%s\n", buf);
}
}
它们本身也不是相同的阿!
一个是客户端的套接字sock,绑定了你输入的服务器的ip地址和端口,这个socket,只是在这个ip和对应的端口作I/O操作
服务器是客户端accept返回的sock套接字,它只是处理对应客户端的I/O操作的!
因为是同一个进程里,所以你要保证它们在通信的时候 各自的 socket都是有效的!