参考资料:<<Linux网络编程.pdf>>page119-205

代码本来是全照书上抄的,后来发现编译不成功,所以就稍微改了下。下面是我修改后的代码:

server.c

// OOB套接字传输服务端(Server.c)
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <fcntl.h>
#define MYPORT 4000
#define BACKLOG 10
int new_fd;
void sig_urg(int signo)
{
int n;
char buf[100];
printf("SIGURG received\n");
n = recv(new_fd, buf, sizeof(buf)-1, MSG_OOB);
buf[n] = 0;
printf("recv %d OOB bytes: %s\n", n, buf);
}
int main(int argc, char *argv[])
{
int sock_fd;
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
int sin_size, n;
char buf[100];
if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
return 1;
}
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;  // 自动设置为自己的IP
bzero(&(my_addr.sin_zero), 8);          // 将结构的其余空间清零
if(bind(sock_fd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr)) == -1)
{
perror("bind");
return 1;
}
if(listen(sock_fd, BACKLOG) == -1)
{
perror("listen");
return 1;
}
void *old_sig_urg_handle;               // 保存系统默认的信号处理函数
if((old_sig_urg_handle = signal(SIGURG, sig_urg)) == SIG_ERR)
{
perror("signal");
return 1;
}
fcntl(sock_fd, F_SETOWN, getpid());
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if((new_fd = accept(sock_fd, (struct sockaddr*)&their_addr, &sin_size)) == -1)
{
perror("accept");
continue;
}
printf("server: got connection from [%s]\n", inet_ntoa(their_addr.sin_addr));
if(!fork())
{
while(1)
{
if((n = recv(new_fd, buf, sizeof(buf)-1, 0)) <= 0)     // 接收正常数据
{
printf("recv EOF\n");
break;
}
buf[n] = 0;
printf("Recv: %d bytes: %s\n", n, buf);
close(new_fd);
}
exit(0);
}
}
while(waitpid(-1, NULL, WNOHANG) > 0);
signal(SIGURG, old_sig_urg_handle);     // 恢复系统默认的信号处理函数
return 0;
}

Client.c

// OOB套接字传输客户端(Client.c)
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MYPORT 4000
#define MAXDATASIZE 100
int main(int argc, char *argv[])
{
int sock_fd;
char buf[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in their_addr;
if(argc < 2)
{
fprintf(stderr, "Usage: %s <hostname>\n", argv[0]);
return 1;
}
if((he = gethostbyname(argv[1])) == NULL)
{
herror("gethostbyname");
return 1;
}
if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
return 1;
}
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(MYPORT);
their_addr.sin_addr = *((struct in_addr*)he->h_addr);
bzero(&(their_addr.sin_zero), 8);
if(connect(sock_fd, (struct sockaddr*)&their_addr, sizeof(struct sockaddr)) == -1)
{
perror("connect");
return 1;
}
if(send(sock_fd, "123", 3, 0) == -1)
{
perror("send");
close(sock_fd);
return 0;
}
printf("Send 3 bytes of normal data\n");
sleep(1);
if(send(sock_fd, "4", 1, MSG_OOB) == -1)
{
perror("send");
close(sock_fd);
return 0;
}
printf("Send 1 byte of OOB data\n");
sleep(1);
if(send(sock_fd, "56", 2, 0) == -1)
{
perror("send");
close(sock_fd);
return 0;
}
printf("Send 2 bytes of normal data\n");
sleep(1);
if(send(sock_fd, "7", 1, MSG_OOB) == -1)
{
perror("send");
close(sock_fd);
return 0;
}
printf("Send 1 byte of OOB data\n");
sleep(1);
if(send(sock_fd, "89", 2, MSG_OOB) == -1)
{
perror("send");
close(sock_fd);
return 0;
}
printf("Send 2 bytes of OOB data\n");
sleep(1);
close(sock_fd);
return 0;
}

运行结果:

1. Server端:

[zcm@socket #39]$./myserver
server: got connection from [127.0.0.1]
Recv: 3 bytes: 123
recv EOF

2. 客户端:

[zcm@socket #25]$./myclient localhost
Send 3 bytes of normal data
Send 1 byte of OOB data
Send 2 bytes of normal data
Send 1 byte of OOB data
Send 2 bytes of OOB data
[zcm@socket #26]$

现在的疑问是:我感觉signal函数虽然调用成功了,但是没起到作用。我认为正常情况下,sig_urg()应该会被调用,但结果是好像他没有收到SIGURG信号,所以没有调用sig_urg这个函数。

若有高人能解决,小弟万分感激!

OOB套接字传输实例(达不到预期结果)相关推荐

  1. TCP套接字编程实例(一)

    TCP套接字编程实例(一) TCP套接字编程第一部分我们先用单线程简单实现客户端的"发"和服务器的"收".话不多说,直接上代码. 1.Client部分: #in ...

  2. C# 2.0 套接字编程实例初探

    首先从原理上解释一下采用Socket接口的网络通讯,这里以最常用的C/S模式作为范例,首先,服务端有一个进程(或多个进程)在指定的端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以 ...

  3. Python套接字通信实例

    Sender: import socket #创建一个socket对象, #socket.AF_INET表示IPV4,socket.AF_INET6表示IPV6 #socket.SOCK_STREAM ...

  4. 第2章 基本的TCP套接字

    2.1 IPv4 TCP客户端     4个步骤: (1) socket()创建TCP套接字(window下要用初始化套接字环境) (2) connect()建立到达服务起的连接 (3) send() ...

  5. Linux网络编程 - 套接字与协议族

    一 理解网络编程和套接字(socket) 1.1 网络编程和套接字概要 网络编程就是编程程序使两台连网的计算机可以互相交换数据.那么,这两台计算机之间用什么传输数据呢?首先需要物理连接.如今大部分计算 ...

  6. C# 网络编程之套接字编程基础知识

    最近阅读了周存杰编写的<C#网络编程实例教程>并阅读了很多相关方面的资料,同时自己也做了一些套接字编程方面的C#程序,所以根据它的知识总结了最近的套接字编程的一些知识点,方便自己的理解与他 ...

  7. 浅析C#中的套接字编程

    套接字基本概念: 套接字是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.可以将套接字看作不同主机间的进程进行双向通信的端点,它构成了单个主机内及整个网络间的编程界面.套接字存在于通信域中 ...

  8. python16进制字节序_第 1 章 套接字、IPv4和简单的客户端/服务器编程

    第 1 章 套接字.IPv4和简单的客户端/服务器编程 本章攻略: 打印设备名和IPv4地址 获取远程设备的IP地址 将IPv4地址转换成不同的格式 通过指定的端口和协议找到服务名 主机字节序和网络字 ...

  9. 网络编程(part10)--socket套接字编程之UDP套接字

    鄙人学习笔记 文章目录 UDP套接字编程 服务端流程 举个例子 客户端流程 举个例子 TCP套接字和UDP套接字编程区别 UDP套接字编程 服务端流程 创建数据报套接字 sockfd = socket ...

最新文章

  1. Qt实现FlatUI样式(开源)
  2. nodejs 获取url字段
  3. 生成和合入patch的两种方式
  4. HDU 5536 Chip Factory 字典树+贪心
  5. 【连载】如何掌握openGauss数据库核心技术?秘诀四:拿捏事务机制(4)
  6. tomcat出现5个using_下肢深静脉血栓要警惕,出现这5个症状,马上看医生
  7. jwt如何防止token被窃取_如何使用 NodeJS 实现 JWT 原理
  8. keras系列︱Application中五款已训练模型、VGG16框架(Sequential式、Model式)解读(二)
  9. 微软最强命令行工具发布,强势霸榜GitHub
  10. 前端js实现打印excel表格
  11. sublimeText3安装、激活、环境配置与代码补全神器Kite安装配置
  12. DMTF Redfish 概念介绍
  13. UV/PV 的共同点和区别
  14. 08. 微信公众号生成带参数二维码
  15. 2022-07-17 第四小组 孙翰章 职业规划
  16. 大数据为我们的生活带来了什么?
  17. STM32普通IO模拟SPI和W25Q32通信调试
  18. 数论-Lucas(卢卡斯定理)
  19. 通过USB连接越狱iPhone,SSH进入设备
  20. idea的文件一直在不停闪烁,并不停updating and index

热门文章

  1. 天龙2 场景地图人物 方向箭头 方法
  2. Kubernetes 入门(3)集群安装
  3. leetcode130. 被围绕的区域(bfs)
  4. 调用lambda_如何使用Lambda调用上下文动态设置超时
  5. 项目经济规模的估算方法_估算英国退欧的经济影响
  6. Go_笔试题记录-指针与值类型实现接口的区别
  7. XMLHttpRequest状态码及相关事件
  8. Python——三级菜单
  9. 笔记本安装win7和arch linux双系统+xfce4桌面
  10. ThinkPHP框架 _ 学习3