服务器:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <errno.h>
#define PORT 18888 /*端口*/
#define BUFLEN 1024 /*缓存区大小*/
#define LISTENNUM 20 /*socket最大监听数*/
int main(int argc,char** argv)
{
int sockfd,newfd; /*本地socket句柄 和 客户端socket句柄*/
int sin_size;
struct sockaddr_in s_addr,c_addr; /*c/s 地址信息结构体,下面有具体的属性赋值*/
char buffer[BUFLEN]=""; /*缓存区*/
/*创建socket*/
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
perror("socket");
return -1;
}
printf("[CrissLeung] socket create success!\n");
memset(&s_addr,0,sizeof(s_addr));
/*定义s_addr 的sockaddr_in结构体数据*/
s_addr.sin_family = AF_INET; /*该属性表示接收本机或其他机器传输*/
s_addr.sin_port = htons(PORT); /*端口号*/
s_addr.sin_addr.s_addr = htons(INADDR_ANY); /*IP,括号内容表示本机IP*/
printf("[CrissLeung] socket start bind!\n");
//绑定地址结构体和socket,成功返回0,出错返回-1
if(bind(sockfd,(struct sockaddr*)&s_addr,sizeof(struct sockaddr))<0)
{
printf("bind error");
return -1;
}
//开启监听 ,第二个参数是最大监听数,成功返回0,出错返回-1
printf("[CrissLeung] socket bind success!\n");
listen(sockfd, LISTENNUM);
printf("[CrissLeung] socket listen success!\n");
while(1)
{
sin_size=sizeof(struct sockaddr_in);/*信息结构体size*/
//在这里阻塞知道接收到消息,参数分别是socket句柄,接收到的地址信息以及大小,成功返回非负socket,出错返回-1
if((newfd=accept(sockfd,(struct sockaddr*)&c_addr,&sin_size))== -1)
{
printf("[CrissLeung] receive failed\n");
}
else
{
printf("[CrissLeung] new client connect success\n");
while(1)
{
memset(buffer,0,sizeof(buffer));
//接收内容,参数分别是连接句柄,缓存区,缓存区大小,其他信息(设为0即可)
int len = recv(newfd, buffer, sizeof(buffer),0);
printf("[CrissLeung]: [%s]\n",buffer);
if(strcmp(buffer,"exit\n")==0)
{
break;
}
// fputs(buffer, stdout);
memset(buffer,0,sizeof(buffer));
printf("[remote]:");
gets(buffer);
printf("\n");
/*发送内容,参数分别是连接句柄,内容,大小,其他信息(设为0即可)*/
send(newfd, buffer, strlen(buffer), 0);
}
}
}
}
客户端:
结构注释参考上述服务端
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/wait.h>
#define DEST_PORT 18888
#define DEST_IP "47.95.231.165"
#define MAX_DATA 1024
int main(){
int sockfd;
struct sockaddr_in dest_addr;
char rBuf[MAX_DATA];
char sBuf[MAX_DATA];
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1)
{
printf("socket failed:%d\n",errno);
}
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons(DEST_PORT);
dest_addr.sin_addr.s_addr=inet_addr(DEST_IP);
bzero(&(dest_addr.sin_zero),8);
if(connect(sockfd,(struct sockaddr*)&dest_addr,sizeof(struct sockaddr))==-1)
{
printf("connect failed:%d\n",errno);
}
else
{
printf("[CrissLeung]connect success\n");
while(1)
{
memset(rBuf,'\0',sizeof(rBuf));
memset(sBuf,'\0',sizeof(sBuf));
printf("[CrissLeung]:");
gets(sBuf);
// printf("CrissLeung]:%s\n",sBuf);
send(sockfd,sBuf,strlen(sBuf),0);
recv(sockfd,rBuf,MAX_DATA,0);
printf("[于淑媛]:%s\n",rBuf);
}
}
close(sockfd);
return 0;
}