网络编程示例,写一个简单的QQ程序
服务器端
#include<arpa/inet.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<stdio.h>
#include<time.h>
#define port 8888
char* getDateTime();
int main()
{
//定义服务器 客户端的套接字描述符
int sfd=0,cfd=0,ret=0,addrlen=0,count=0;
char * nowtime;
//定义接收缓存区
unsigned char ReadBuffer[1024];
unsigned char SendBuffer[1024];
//定义服务器 客户端的套接字数据结构
struct sockaddr_in saddr,caddr;
//数据结构清0
memset(&saddr,0,sizeof(struct sockaddr));
memset(&caddr,0,sizeof(struct sockaddr));
//创建服务器套接字
sfd=socket(AF_INET,SOCK_STREAM,0);
//判断
if(sfd == -1)
{
perror("socket");
exit(-1);
}
//初始化服务器套接字数据结构
saddr.sin_family = AF_INET;
saddr.sin_port = htons(port);
saddr.sin_addr.s_addr = INADDR_ANY;
bzero(saddr.sin_zero,8);
//套接字绑定
ret = bind(sfd,(struct sockaddr*)(&saddr),sizeof(struct sockaddr));
if(ret == -1)
{
perror("bind");
exit(-1);
}
//监听设置
ret=listen(sfd,10);
if(ret == -1)
{
perror("listen");
exit(-1);
}
while(1)
{
//接收等待
addrlen = sizeof(struct sockaddr);
cfd=accept(sfd,(struct sockaddr*)(&caddr),&addrlen);
if(cfd == -1)
{
perror("accept");
}
printf("从机ip是%s\n",inet_ntoa(caddr.sin_addr));
if(fork()==0)
{
while(1)
{
if(fork()==0)
{
fgets(SendBuffer,1024,stdin);
send(cfd,SendBuffer,1024,0);
printf("\n");
}
nowtime=getDateTime();
count= recv(cfd,ReadBuffer,1024,0);
//printf("count is %d\n",count);
ReadBuffer[count]='\0';
printf("李京京 %s\n",nowtime);
printf("%s\n",ReadBuffer);
}
}
}
}
char* getDateTime()
{
static char nowtime[20];
time_t rawtime;
struct tm* ltime;
time(&rawtime);
ltime=localtime(&rawtime);
strftime(nowtime,20,"%Y-%m-%d %H:%M:%S",ltime);
return nowtime;
}
客户端
#include<arpa/inet.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<stdio.h>
#include<time.h>
#define port 8888
char* getDateTime();
int main(int argc,char **argv)
{
//定义服务器 客户端的套接字描述符
int cfd=0,ret=0;
char * nowtime;
//定义接收缓存区
unsigned char SendBuffer[1024];
unsigned char ReadBuffer[1024];
//定义服务器 客户端的套接字数据结构
struct sockaddr_in saddr,caddr;
//数据结构清0
memset(&saddr,0,sizeof(struct sockaddr));
memset(&caddr,0,sizeof(struct sockaddr));
//创建服务器套接字
cfd=socket(AF_INET,SOCK_STREAM,0);
//判断
if(cfd == -1)
{
perror("socket");
exit(-1);
}
//初始化服务器套接字数据结构
caddr.sin_family = AF_INET;
caddr.sin_port = htons(port);
inet_aton(argv[1],&caddr.sin_addr);
bzero(caddr.sin_zero,8);
ret = connect(cfd,(struct sockaddr*)(&caddr),sizeof(struct sockaddr));
if(ret == -1)
{
perror("ret");
exit(-1);
}
while(1)
{
if(fork()==0)
{
nowtime=getDateTime();
ret=recv(cfd,ReadBuffer,1024,0);
printf("张超 %s\n",nowtime);
ReadBuffer[ret]='\0';
printf("%s\n",ReadBuffer);
}
fgets(SendBuffer,1024,stdin);
send(cfd,SendBuffer,1024,0);
printf("\n");
}
}
char* getDateTime()
{
static char nowtime[20];
time_t rawtime;
struct tm* ltime;
time(&rawtime);
ltime=localtime(&rawtime);
strftime(nowtime,20,"%Y-%m-%d %H:%M:%S",ltime);
return nowtime;
}
代码执行效果
客户机端操作
root@DESKTOP-FR31BP0:/mnt/e/mycode/socket/mytcp# ./myclient 192.168.1.2
你好
哈哈哈
张超 2018-08-23 08:47:49
nihao
张超 2018-08-23 08:47:43
hahaha
服务器端操作
root@DESKTOP-FR31BP0:/mnt/e/mycode/socket/mytcp# ./myserver
从机ip是192.168.1.2
李京京 2018-08-23 08:47:38
你好
李京京 2018-08-23 08:47:43
哈哈哈
nihao
hahaha