发送数据端
#include<stdio.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
int main(void){
//1.创建套接字
int fd = socket(AF_INET,SOCK_STREAM,0);
if(fd == -1){
perror("socket");
exit(0);
}
//2.连接服务器端
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
inet_pton(AF_INET,"192.168.131.137",&serveraddr.sin_addr.s_addr);
serveraddr.sin_port = htons(9999);
int ret = connect(fd,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
if(ret == -1){
perror("connect");
exit(0);
}
//3.通信
const char*oob_data = "abc";
const char*normal_data = "123";
send(fd,normal_data,strlen(normal_data),0);
send(fd,oob_data,strlen(oob_data),MSG_OOB);
send(fd,normal_data,strlen(normal_data),0);
close(fd);
return 0;
}
接受数据端
#include<stdio.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#define BUF_SIZE 1024
int main(void){
//1.创建 socket 套接字
int lfd = socket(AF_INET,SOCK_STREAM,0);
if (lfd == -1)
{
perror("socket");
exit(0);
}
//2.绑定
struct sockaddr_in sadder;
sadder.sin_family = AF_INET;
//inet_pton(AF_INET,"127.0.0.1",sadder.sin_addr.s_addr);服务端写的是本机的地址
sadder.sin_addr.s_addr = INADDR_ANY;//0.0.0.0 表示任意网关的地址,一种简单的写法
sadder.sin_port= htons(9999);
//sockaddr 和 sockaddr_in 这两种类型的指针可以互相转换?
int ret = bind(lfd,(struct sockaddr*)&sadder,sizeof(sadder));
if (ret == -1)
{
perror("bind");
exit(-1);
}
//3.监听
ret = listen(lfd,8);
if (ret == -1)
{
perror("listen");
exit(-1);
}
//4.接收客户端连接
struct sockaddr_in clientaddr;
socklen_t len = sizeof(clientaddr);
int cfd = accept(lfd,(struct sockaddr*)&clientaddr,&len);
if (cfd == -1)
{
perror("accept");
exit(-1);
}
//输出客户端信息
char clientIP[16];
inet_ntop(AF_INET,&clientaddr.sin_addr.s_addr,clientIP,sizeof(clientIP));
unsigned short clientPort = ntohs(clientaddr.sin_port);
printf("client ip is %s, port is %d.\n",clientIP,clientPort);
//5.获取客户端的数据
char buffer[BUF_SIZE];
memset(buffer,'\0',BUF_SIZE);
ret = recv(cfd,buffer,BUF_SIZE-1,0);
printf("got %d bytes of normal data '%s'\n",ret,buffer);
memset(buffer,'\0',BUF_SIZE);
ret = recv(cfd,buffer,BUF_SIZE-1,MSG_OOB);
printf("got %d bytes of oob data '%s'\n",ret,buffer);
memset(buffer,'\0',BUF_SIZE);
ret = recv(cfd,buffer,BUF_SIZE-1,0);
printf("got %d bytes of normal data '%s'\n",ret,buffer);
close(cfd);
return 0;
}
最终的运行结果
尝试用 tcpdump 抓包但是没有抓到不知道为什么。