根据网上各位大佬的资源,加上个人修改完成的一些简单的文件与字符串多端通信,分享一下。tcp长短连接的多客户端通信,还有UDP的单波组播广播代码会在后续贴出。
tcp短连接server.c:
/*server.c*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#define SERVPORT 3333
#define BACKLOG 10
#define MAXDATASIZE 100
int main(void)
{
struct sockaddr_in server_sockaddr, client_sockaddr ;
int sin_size=0;
int recvbytes=0;
int sockfd=0;
int client_fd=0;
char buf [MAXDATASIZE]={0};
/*建立socket连接*/
if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror ("socket") ;
exit(1) ;
}
printf ("socket success!,sockfd=%d\n", sockfd);
/*设置sockaddr in结构体中相关参数*/
server_sockaddr.sin_family=AF_INET ;
server_sockaddr.sin_port=htons(SERVPORT);
server_sockaddr.sin_addr.s_addr=INADDR_ANY ;
bzero(&(server_sockaddr.sin_zero) ,8);
/*绑定函数bind*/
if (bind(sockfd, (struct sockaddr*) &server_sockaddr ,sizeof (struct sockaddr))==-1)
{
perror ("bind") ;
exit(1) ;
}
printf ("bind success! \n") ;
/*调用listen函数*/
if (listen(sockfd , BACKLOG)==-1)
{
perror ("listen") ;
exit(1) ;
}
printf ("listening.....\n");
/*调用accept函数,等待客户端的连接*/
if((client_fd=accept(sockfd, (struct sockaddr*)&client_sockaddr,&sin_size))==-1)
{
perror ("accept") ;
exit(1) ;
}
/*调用recv函数接收客户端的请求*/
if ( (recvbytes=recv(client_fd,buf,MAXDATASIZE,0))==-1)
{
perror ("recv") ;
exit(1) ;
}
printf ("received a connection :%s\n",buf) ;
/*将获取的字符串回传给客户端*/
send(client_fd,buf,100,0);
printf("成功回传 :%s\n",buf) ;
close (sockfd) ;
return 0;
}
tcp短连接client.c:
/*client.c*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define SERVPORT 3333
main(int argc,char *argv[])
{
int sockfd=0;
int sendbytes=0;
struct hostent *host;
struct sockaddr_in serv_addr;
char recv_buf[100]={0};
char send_buf[100]={0};
if(argc < 2)
{
fprintf (stderr, "Please enter the server's hostname! n") ;
exit(1) ;
}
/*地址解析函数*/
if ((host=gethostbyname (argv[1]))== NULL)
{
perror("gethostbyname");
exit(1);
}
/*创建 socket*/
if ((sockfd=socket(AF_INET , SOCK_STREAM,0))== -1)
{
perror("socket");
exit(1);
}
/*设置sockaddr in结构体中相关参数*/
serv_addr.sin_family=AF_INET ;
serv_addr.sin_port=htons(SERVPORT) ;
serv_addr.sin_addr=*((struct in_addr *)host->h_addr) ;
bzero(&(serv_addr.sin_zero),8);
/*调用connect函数主动发起对服务器端的连接*/
if (connect (sockfd,(struct sockaddr *) &serv_addr,sizeof (struct sockaddr))== -1)
{
perror (" connect") ;
exit(1) ;
}
/*发送消息给服务器端*/
printf("input your message:");
gets(send_buf);
if((sendbytes=send (sockfd,send_buf,100,0))==-1)
{
perror("send");
exit(1);
}
recv(sockfd, recv_buf, 100, 0);
printf ("received 回复 :%s\n",recv_buf) ;
close(sockfd);
return 0;
}
tcp长连接server.c:
/*server1.c*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#define SERVPORT 3344
#define BACKLOG 10
#define MAXDATASIZE 100
#define BUF_SIZE 1024
int main(void)
{
struct sockaddr_in server_sockaddr, client_sockaddr ;
int sin_size=0;
int recvbytes=0;
int sockfd=0;
int client_fd=0;
char buf [100]={0};
char send_buf [BUF_SIZE]={0};
char filename[100]={0};
char ch={0};
FILE *fp=NULL;
/*建立socket连接*/
if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror ("socket") ;
exit(1) ;
}
printf ("socket success!,sockfd=%d\n", sockfd);
/*设置sockaddr in结构体中相关参数*/
server_sockaddr.sin_family=AF_INET ;
server_sockaddr.sin_port=htons(SERVPORT);
server_sockaddr.sin_addr.s_addr=INADDR_ANY ;
bzero(&(server_sockaddr.sin_zero) ,8);
/*绑定函数bind*/
if (bind(sockfd, (struct sockaddr*) &server_sockaddr ,sizeof (struct sockaddr))==-1)
{
perror ("bind") ;
exit(1) ;
}
printf ("bind success! \n") ;
/*调用listen函数*/
if (listen(sockfd , BACKLOG)==-1)
{
perror ("listen") ;
exit(1) ;
}
printf ("listening.....\n");
/*调用accept函数,等待客户端的连接*/
if((client_fd=accept(sockfd, (struct sockaddr*)&client_sockaddr,&sin_size))==-1)
{
perror ("accept") ;
exit(1) ;
}
/*调用recv函数接收客户端的请求*/
if ( (recvbytes=recv(client_fd,buf,MAXDATASIZE,0))==-1)
{
perror ("recv") ;
exit(1) ;
}
printf ("received a connection :%s\n",buf) ;
/*将获取的字符串回传给客户端*/
send(client_fd,buf,5,0);
printf("成功回传 :%s\n",buf) ;
while(1)
{
printf("filename:");
gets(filename);
fp = fopen (filename,"rb");
if(fp == NULL)
{
printf("Cannot open file!\n");
continue;
}
send(client_fd,filename,100,0);
printf("开始发送%s\n",filename);
int nCount=0;
int fr=0;
while(!feof(fp))
{
nCount = fread(send_buf, 1, BUF_SIZE, fp);
fr=send(client_fd, send_buf, nCount, 0);
printf("##############%d##############\n",fr);
if(fr!=nCount)
{
printf("发送失败,重新发送");
break;
}
//printf("%s",send_buf);
memset(send_buf, 0, sizeof (send_buf));
}
fclose(fp);
printf("发送%s成功\n",filename) ;
for (unsigned int i = 0; i < strlen(filename); i++)
{
filename[i] = '\0' ;
}
sleep(1);
}
return 0;
}
tcp长连接client.c:
/*client1.c*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define SERVPORT 3344
#define BUF_SIZE 1024
main(int argc,char *argv[])
{
int sockfd=0;
int sendbytes=0;
struct hostent *host;
struct sockaddr_in serv_addr;
char rev_buf[BUF_SIZE]={0};
char ch[100]={0};
char f_buf[]="\final";
int server_fd=0;
if(argc < 2)
{
fprintf (stderr, "Please enter the server's hostname! n") ;
exit(1) ;
}
/*地址解析函数*/
if ((host=gethostbyname (argv[1]))== NULL)
{
perror("gethostbyname");
exit(1);
}
/*创建 socket*/
if ((sockfd=socket(AF_INET , SOCK_STREAM,0))== -1)
{
perror("socket");
exit(1);
}
/*设置sockaddr in结构体中相关参数*/
serv_addr.sin_family=AF_INET ;
serv_addr.sin_port=htons(SERVPORT) ;
serv_addr.sin_addr=*((struct in_addr *)host->h_addr) ;
bzero(&(serv_addr.sin_zero),8);
/*调用connect函数主动发起对服务器端的连接*/
if ((server_fd=connect (sockfd,(struct sockaddr *) &serv_addr,sizeof (struct sockaddr)))== -1)
{
perror (" connect") ;
exit(1) ;
}
/*发送消息给服务器端*/
if((sendbytes=send (sockfd,"hello",5,0))==-1)
{
perror("send");
exit(1);
}
recv(sockfd, rev_buf, 100, 0);
printf ("收到信息:%s\n",rev_buf) ;
char rv_buf[BUF_SIZE]={0};
char send_buf[BUF_SIZE]={0};
char filename[100]={0};
FILE *fp=NULL;
int flag=0;
while(1)
{
flag=recv(sockfd, filename, 100, 0);
//printf("%d",flag);
if (flag>0)
{
fp = fopen(filename, "w");
printf("开始接收:%s\n", filename);
int nCount = 1024;
int fw=0;
while (nCount == 1024)
{
nCount = recv(sockfd, rv_buf, BUF_SIZE, 0);
fw=fwrite(rv_buf, 1, nCount, fp);
if(fw!=nCount)
{
printf("write error");
exit(-1);
}
printf("##############%d##############\n",nCount);
//printf("%s",rv_buf);
for (unsigned int i = 0; i < strlen(rv_buf); i++)
{
rv_buf[i] = '\0' ;
}
}
printf("接收成功:%s\n", filename);
fclose(fp);
fp=NULL;
flag=0;
printf("%d",flag);
for (unsigned int i = 0; i < strlen(filename); i++)
{
filename[i] = '\0' ;
}
//printf("清除:%s\n", filename);
sleep(1);
}
}
return 0;
}