原文链接:http://blog.csdn.net/itisyang/article/details/48209223
服务器建立:
采用了多线程方式,可连接多个客户端,每连接一个客户端就创建一个输入线程和一个接受线程,使得输入和接收互不干扰
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<unistd.h>
#include<netinet/in.h>
#include<string.h>
#include<pthread.h>
#include<fcntl.h>
#include"wrap.h"
char buff[BUFSIZ];
void* thread_fun(void* arg)
{
if(pthread_detach(pthread_self())){
printf("thread detach fail\n");
}
int len;
while(1){
bzero(buff,BUFSIZ);
len = Read((int)arg,buff,BUFSIZ);
if(len<=0){
printf("connect lost\n");
close((int)arg);
return (void*) 1;
}
printf("%s\n",buff);
}
return (void*) 0;
}
void* thread_fun2(void* arg)
{
char main_buff[BUFSIZ];
int len;
if(pthread_detach(pthread_self())){
printf("thread detach fail\n");
}
while(1){
bzero(main_buff,BUFSIZ);
len = read(STDIN_FILENO,main_buff,BUFSIZ);
Write((int)arg,main_buff,len);
}
return (void*)0;
}
int main()
{
pthread_t id1,id2;
struct sockaddr_in servaddr,clientaddr;
socklen_t addlen;
int clifd;
int err;
//creat tcp option
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd == -1){
perror("socket");
return 1;
}
// int opt = 1;
int opt = SO_REUSEADDR;
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
//initialization of socket()
memset(&servaddr,0,sizeof(struct sockaddr_in));
//bzero(&servaddr,sizeof(sockaddr_in));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(8080);
addlen = sizeof(struct sockaddr_in);
Bind(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
while(1){
Listen(sockfd,10);
clifd = Accept(sockfd,(struct sockaddr*)&clientaddr,&addlen);
printf("new client,ip:%s,%d\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));
if(clifd>=0){
pthread_create(&id1,NULL,thread_fun,(void*)clifd);
pthread_create(&id2,NULL,thread_fun2,(void*)clifd);
}
}
psuse();
close(clifd);
close(sockfd);
return 0;
}
客户端建立:
类似服务器
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<unistd.h>
#include<netinet/in.h>
#include<string.h>
#include<pthread.h>
#include<fcntl.h>
#include"wrap.h"
void* fun1(void *arg)
{
char buff[BUFSIZ];
while(1){
memset(buff,0,BUFSIZ);
int err = read((int)arg,buff,BUFSIZ);
if(err<0)
printf("read error\n");
printf("%s",buff);
}
}
void* fun2(void* arg)
{
char buff[BUFSIZ];
while(1){
memset(buff,0,BUFSIZ);
read(STDIN_FILENO,buff,BUFSIZ);
write((int)arg,buff,strlen(buff));
}
}
int main(int arg,char *argv[])
{
pthread_t id1,id2;
struct sockaddr_in sock;
int clifd;
int err;
//creat tcp option
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd == -1){
perror("socket");
return 1;
}
//initialization of socket()
memset(&sock,0,sizeof(struct sockaddr_in));
sock.sin_family = AF_INET;
sock.sin_addr.s_addr = inet_addr(argv[1]);
sock.sin_port = htons(8080);
err = connect(sockfd,(struct sockaddr*)&sock,sizeof(sock));
if(err == -1){
perror("connect");
return -1;
}
pthread_create(&id1,NULL,fun1,(void *)sockfd);
pthread_create(&id2,NULL,fun2,(void *)sockfd);
pause();
close(sockfd);
return 0;
}