(五)socket实践编程
1、服务器端程序编写
(1)socket
(2)bind
(3)listen
(4)accept,返回值是一个fd,accept正确返回就表示我们已经和前来连接我的客户端之间建立了一个TCP连接了,以后我们就要通过这个连接来和客户端进行读写操作,读写操作就需要一个fd,这个fd就由accept来返回了。
注意:socket返回的fd叫做监听fd,是用来监听客户端的,不能用来和任何客户端进行读写;accept返回的fd叫做连接fd,用来和连接那端的客户端程序进行读写。
2、客户端程序编写
(1)socket
(2)connect
概念:端口号,实质就是一个数字编号,用来在我们一台主机中(主机的操作系统中)唯一的标识一个能上网的进程。端口号和IP地址一起会被打包到当前进程发出或者接收到的每一个数据包中。每一个数据包将来在网络上传递的时候,内部都包含了发送方和接收方的信息(就是IP地址和端口号),所以IP地址和端口号这两个往往是打包在一起不分家的。
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h> #define SERPORT 9003
#define SERADDR "192.168.1.141" // ifconfig看到的
#define BACKLOG 100 char recvbuf[]; int main(void)
{
// 第1步:先socket打开文件描述符
int sockfd = -, ret = -, clifd = -;
socklen_t len = ;
// sockaddr_in:为IPV4数据结构类型,sockaddr_in6位IPV6数据结构类型。sockaddr兼容这两种
struct sockaddr_in seraddr = {};
struct sockaddr_in cliaddr = {}; char ipbuf[] = {}; sockfd = socket(AF_INET, SOCK_STREAM, );
if (- == sockfd)
{
perror("socket");
return -;
}
printf("socketfd = %d.\n", sockfd); // 第2步:bind绑定sockefd和当前电脑的ip地址&端口号
seraddr.sin_family = AF_INET; // 设置地址族为IPv4
// 设置地址的端口号信息,以太网通信,我们默认为大端模式,这里端口号,我们要进行转换,htons表示将整型变量从主机字节顺序转变成网络字节顺序, 就是整数在地址空间存储方式变为:高字节存放在内存的低地址处
seraddr.sin_port = htons(SERPORT);
//
//设置IP地址,inet_addr将10进制字符串IP地址转换为二进制网络字节序,这个函数里面做了大端处理,不过inet_addr只适用于IPV4,现在一般使用inet_pton,它适用于IPV4和IPV6
seraddr.sin_addr.s_addr = inet_addr(SERADDR);
ret = bind(sockfd, (const struct sockaddr *)&seraddr, sizeof(seraddr));
if (ret < )
{
perror("bind");
return -;
}
printf("bind success.\n"); // 第三步:listen监听端口,BACKLOG为可挂载的监听到的个数
ret = listen(sockfd, BACKLOG); // 阻塞等待客户端来连接服务器
if (ret < )
{
perror("listen");
return -;
} // 第四步:accept阻塞等待客户端接入
clifd = accept(sockfd, (struct sockaddr *)&cliaddr, &len);
printf("连接已经建立,client fd = %d.\n", clifd); /*
// 建立连接之后就可以通信了
// 客户端给服务器发
ret = recv(clifd, recvbuf, sizeof(recvbuf), 0);
printf("成功接收了%d个字节\n", ret);
printf("client发送过来的内容是:%s\n", recvbuf);
*/ /*
// 客户端反复给服务器发
while (1)
{
ret = recv(clifd, recvbuf, sizeof(recvbuf), 0);
//printf("成功接收了%d个字节\n", ret);
printf("client发送过来的内容是:%s\n", recvbuf);
memset(recvbuf, 0, sizeof(recvbuf));
}
*/
// 服务器给客户端发
strcpy(recvbuf, "hello world.");
ret = send(clifd, recvbuf, strlen(recvbuf), );
printf("发送了%d个字符\n", ret); return ;
}
(五)socket实践编程的更多相关文章
- socket实践编程1
1.服务器端程序编写 (1).socket (2).bind (3).listen (4).accept,返回值是一个fd,accept正确返回就表示我们已经和前来连接我的客户端之间建立了一个TCP连 ...
- 20145206《Java程序设计》实验五Java网络编程及安全
20145206<Java程序设计>实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 我和201451 ...
- 20145211 《Java程序设计》实验报告五————Java网络编程及安全实验报告
实验内容 1.掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验步骤 这一部分是与我的partner合作的,详见他的博客- [20145326 <Java程序设计> ...
- 25 python socket网络编程
一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频 ...
- Python之路【第七篇】python基础 之socket网络编程
本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket 网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...
- 20145213《Java程序设计》实验五Java网络编程及安全
20145213<Java程序设计>实验五Java网络编程及安全 实验内容 1.掌握Socket程序的编写. 2.掌握密码技术的使用. 3.设计安全传输系统. 实验预期 1.客户端与服务器 ...
- 20145337实验五Java网络编程及安全
20145337实验五Java网络编程及安全 实验内容 掌握Socket程序的编写 掌握密码技术的使用 设计安全传输系统 实验步骤 基于Java Socket实现安全传输 基于TCP实现客户端和服务器 ...
- JAVA课程实验报告 实验五 Java网络编程及安全
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1353 姓名:韩玉琪 学号:20135317 成绩: 指导教师:娄嘉 ...
- 20145225《Java程序设计》 实验五 Java网络编程及安全
20145225<Java程序设计> 实验五 Java网络编程及安全 实验报告 一.实验内容 基于Java Socket实现安全传输. 基于TCP实现客户端和服务器,结对编程一人负责客户端 ...
随机推荐
- 修改pip源
http://www.cnblogs.com/hushaojun/p/4606986.html mkdir -p ~/.pip/ vi ~/.pip/pip.conf [global] trusted ...
- 反向代理在Web渗透测试中的运用
在一次Web渗透测试中,目标是M国的一个Win+Apache+PHP+MYSQL的网站,独立服务器,对外仅开80端口,网站前端的业务系统比较简单,经过几天的测试也没有找到漏洞,甚至连XSS都没有发现, ...
- ios每日一发--Leanclude数据云存储以及登录 注册账户
利用LeanCloud来实现注册账号,存储账号以及,登录时查询账号是否正确.集成方式很简单可以看这里的官方文档.地址是这里: https://leancloud.cn/docs/ 在这里创建应用,以及 ...
- 图割Graph-Cut的最大流实现
利用最大流标号法求解最大流,详见代码: Version:未加头尾节点版: 缺点:havn't take nodes' pixels into consideration /************** ...
- hibernate 实现多表连接查询(转载)
http://www.cnblogs.com/lihuiyy/archive/2013/03/28/2987531.html 为了方便,直接粘过来,方便查看.不收藏了 Hibernate主要支持两种查 ...
- 隐藏,显示任务栏,桌面 C++代码
HWND desktop,task; desktop=FindWindow(L"ProgMan",NULL); task=FindWindow(L"Shell_TrayW ...
- 获取手机通讯录--ios
- (void)test { //这个变量用于记录授权是否成功,即用户是否允许我们访问通讯录 int __block tip=0; //声明一个通讯簿的引用 ABAdd ...
- SpringMvc处理JSON
步骤如下: 1.加入jar包 2.编写目标方法,使其返回JSON对应的对象或集合 3.在方法上添加@ResponseBody注解 DispatcheServlet默认装配RequestMappingH ...
- Git 遇到了 early EOF index-pack failed 问题
Git 遇到了 early EOF index-pack failed 问题 今天想 clone 一下 boost 在 github 的 repo,结果在 clone 的过程中遇到了下面的错误.我原本 ...
- jQuery的deferred对象详解(转载)
本文转载自: jQuery的deferred对象详解(转载)