基于TCP协议的多线程并发服务器实例代码
功能:客户端上传文件到服务器
//服务器代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
typedef struct con_info{
int connfd;
struct sockaddr_in* client_addr;
}CON_INFO;
void *conn_handle(void *argc){
printf("new connection >>>>> from %s , connfd= %d \n",inet_ntoa(((CON_INFO *)argc)->client_addr->sin_addr),((CON_INFO *)argc)->connfd);
char buf[512];
memset(buf,0,sizeof(buf));
while(1){
int ret=read(((CON_INFO *)argc)->connfd,buf,sizeof(buf));
int fp=open(buf,O_RDWR | O_CREAT,0775);
while(1){
ret=read(((CON_INFO *)argc)->connfd,buf,sizeof(buf));
if(ret<=sizeof(buf)){
write(fp,buf,ret);
close(fp);
printf("arrive end position!\n");
memset(buf,-1,sizeof(buf));
exit(-1);
break;
}
write(fp,buf,ret);
}
printf("aceept file complete!\n");
close(fp);
memset(buf,0,sizeof(buf));
}
}
int main(int argc,char *argv[])
{
int sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0){
perror("socket");
exit(-1);
}
printf("socker create successful\n");
//绑定
struct sockaddr_in server_addr;
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=inet_addr("192.168.12.57");
server_addr.sin_port=htons(8080);
if(bind(sockfd,(struct sockeaddr*)&server_addr,sizeof(server_addr))!=0){
perror("bind");
exit(-2);
}
printf("bind successful\n");
//监听
if(listen(sockfd,6)!=0){
perror("listen");
exit(-3);
}
printf("start listen, waitting connection...\n");
//等待客户端链接
pthread_t pt;
while(1){
struct sockaddr_in client_addr;
int client_len=sizeof(client_addr);
int connfd=accept(sockfd,(struct sockaddr *)&client_addr,&client_len);
if(connfd<0){
perror("accept");
exit(-4);
}
printf("connection successful!\n");
CON_INFO con_info;
con_info.connfd=connfd;
con_info.client_addr=((struct sockaddr_in *)&client_addr);
pthread_create(&pt,NULL,conn_handle,&con_info);
pthread_detach(pt);
}
return 0;
}
//客户端代码
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc,char *argv[])
{
int sockfd;
struct sockaddr_in server_addr, client_addr;
//创建套接字
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0){
perror("socket");
exit(-1);
}
printf("create socket successful!\n");
memset(&client_addr,0,sizeof(client_addr));
client_addr.sin_family=AF_INET;
client_addr.sin_addr.s_addr=inet_addr("192.168.12.57");
client_addr.sin_port=htons(8080);
//链接
int client_len=sizeof(client_addr);
int con=connect(sockfd,(struct sockaddr *)&client_addr,client_len);
if(con !=0){
perror("connect");
exit(-2);
}
//发送数据
char buf[512];
memset(buf,0,sizeof(buf));
int ret=-1;
while(1){
printf("please enter a file name in current path: \n");
fgets(buf,sizeof(buf),stdin);
//strcpy(buf,"1.txt");
buf[strlen(buf)-1]='\0';
int fp=open(buf,O_RDONLY);
write(sockfd,buf,strlen(buf));
while((ret=read(fp,buf,sizeof(buf)))>0){
printf("buf = %s\n");
write(sockfd,buf,ret);
}
memset(buf,0,sizeof(buf));
close(fp);
}
printf("send file successful!\n");
return 0;
}