前言
本篇内容只实现基础的建立连接与半双工通信功能
一、通信服务端
/*
* 此程序测试socket点对点的连接服务端
* 作者:zhy 时间:2020 4 5
*/
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <arpa/inet.h>
int main()
{
int serverfd = socket(AF_INET,SOCK_STREAM,0); // 创建服务端socket(监听用)
struct sockaddr_in servaddr; // 服务端地址和端口
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(3000); //设置通信端口
if ( bind(serverfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) != 0)
{ perror("bind"); close(serverfd); return -1; }
if (listen(serverfd,5) != 0) { perror("listen"); close(serverfd); return -1; }
int clientfd = accept(serverfd,0,0);
char buffer[1024];
while(1)
{
memset(buffer,0,sizeof(buffer));
if (recv(clientfd,buffer,sizeof(buffer),0) <= 0) break;
printf("客户:%s\n",buffer);
memset(buffer,0,sizeof(buffer));
printf("回复:");
scanf ("%s",buffer);
if (send(clientfd,buffer,strlen(buffer),0) <= 0) break;
}
close(serverfd); close(clientfd);
}
二、通信客户端
/*
* 此程序演示socket通信点对点客户端
* 作者:zhy 时间: 2020 4 5
*/
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <arpa/inet.h>
#include <netdb.h>
int main()
{
int clientfd = socket(AF_INET,SOCK_STREAM,0);
struct hostent* h;
if ( (h = gethostbyname("192.168.215.132")) == 0 )
{ close(clientfd); return -1; }
struct sockaddr_in servaddr;
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(3000);
memcpy(&servaddr.sin_addr,h->h_addr,h->h_length);
if (connect(clientfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) != 0 )
{ perror("connect"); close(clientfd); return -1; }
char buffer[1024];
while(1)
{
memset(buffer,0,sizeof(buffer));
printf("我(输入bye结束):");
scanf("%s",buffer);
if( strcmp(buffer,"bye") == 0) break;
if (send(clientfd,buffer,strlen(buffer),0) <= 0 ) break;
memset(buffer,0,sizeof(buffer));
if (recv(clientfd,buffer,sizeof(buffer),0) <= 0 ) break;
printf("回应:%s\n",buffer);
}
close(clientfd);
}