简单sock示例程序
转载与修改
http://blog.chinaunix.net/uid-14833587-id-76539.html
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#define MYPORT 5000
char buf[80];
int main(void)
{
int sock, new_sd, adrlen, cnt;
int re_use_addr=1;
int ret;
int status;
pid_t pid;
pid_t pc;
struct sockaddr_in myname;
struct timeval nNetTimeout;
nNetTimeout.tv_sec = 5;
nNetTimeout.tv_usec = 0;
sock = socket(AF_INET, SOCK_STREAM, 0); // 套接字的建立,sock 式套接字描述符号.
if (sock < 0)
{
printf("server socket failure %d\n", errno);
perror("server: ");
exit(1);
}
myname.sin_family = AF_INET; //建立IPV4通信
myname.sin_port = htons(MYPORT); //htons是将整型变量从主机字节顺序转变成网络字节顺序,intel 是小端
myname.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。 一般来说,在各个系统中均定义成为0值。
bzero(&(myname.sin_zero), 8);// 使字符串的多少位置变为0,这个函数已经不常用了.
ret = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)&re_use_addr, sizeof(int));
// SOL_SOCKET 选项定义的层次,另一个是IPPROTO_TCP层次
// SO_REUSEADDR 允许套接口和一个已在使用中的地址捆绑(参见bind())
// setsockopt() 函数用于任意类型、任意状态套接口的设置选项值。
if(ret<0)
{
perror("setsockopt:");
return ret;
}
adrlen = sizeof(struct sockaddr_in);
if (bind(sock, (struct sockaddr *)&myname, adrlen) < 0)
//bind()用来设置给参数sockfd的socket一个名称。此名称由参数my_addr指向一sockaddr结构,对于不同的socket domain定义了一个通用的数据结构 个人猜想 绑定.
{
printf("server bind failure %d\n", errno);
perror("server: ");
exit(1);
}
if (listen(sock, 5) < 0)
//listen()用来等待参数s 的socket连线。参数backlog指定同时能处理的最大连接要求,如果连接数目达此上限则client端将收到ECONNREFUSED的错误。Listen()并未开始接收连线,只是设置socket为listen模式,真正接收client端连线的是accept()。通常listen()会在socket(),bind()之后调用,接着才调用accept()。
{ /* listen函数调用 */
printf("server listen failure %d\n", errno);
perror("server: ");
exit(1);
}
/* 忽略子进程的终止 */
// signal (SIGCHLD, SIG_IGN);
/* 将服务器置于死循环状态,等待客户端的连接请求的到来。
实际上,应该用更好的办法来结束这个死循环,在这里这
个循环是被连接开始信号或者是超级用户终止的。 */
#if 0
//发送时限
ret = setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&nNetTimeout, sizeof(nNetTimeout));
if(ret < 0)
{
perror("server");
}
//接收时限
ret = setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout, sizeof(nNetTimeout));
if(ret < 0)
{
perror("server");
}
#endif
while (1)
{
if ((new_sd = accept(sock, (struct sockaddr *)&myname, &adrlen)) < 0)
{
printf("server accept failure %d\n", errno);
perror("server: ");
exit(1);
}
pc = fork();
if(pc<0)
{
perror("[server]");
}
if (pc == 0)
{ /* 建立子进程 */
close (sock); /* 关闭套接字,因为子进程不再需要它 */
memset(buf,0,sizeof(buf));
cnt = recv(new_sd, buf, sizeof(buf),0);
// recv 从缓冲区拷贝数据.
if(cnt<0)
{
perror("[server]");
}
else if(cnt == 0)
{
printf(" connection closed by client\n");
}
else
{
printf("Server got message:[%d]%s\n",cnt,buf);//recv 成功的化就会返回接收到的字节数据
}
memset(buf,0,sizeof(buf));
strcpy(buf, "[dancy]send message to client:");
cnt = write(new_sd, buf, sizeof(buf));
close (new_sd); /* close prior to exiting */
exit(1);
}
}
close (new_sd); /* close prior to exiting */
close (sock); /* 关闭套接字,因为子进程不再需要它 */
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#define SERVER_PORT 5000
char buf[80];
struct sockaddr_in myname;
int main(void)
{
int sock, adrlen, cnt;
int ret;
struct hostent *h;
if (((h=gethostbyname("192.168.111.45")) == NULL))// 获取ip地址
{
herror("gethostbyname");
exit(1);
}
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0)
{
printf("client socket failure %d\n", errno);
perror("client: ");
exit(1);
}
myname.sin_family = AF_INET;
myname.sin_port = htons(SERVER_PORT);
myname.sin_addr = *((struct in_addr *)h->h_addr);
bzero(&(myname.sin_zero), 8);
ret = connect(sock, (struct sockaddr *) &myname, sizeof(struct sockaddr));
if(ret<0)
{
perror("cannot connect ");
exit(1);
}
memset(buf,0,sizeof(buf));
strcpy(buf, "[dancy]send message dafdasf123454354我爱你 to server leeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
cnt = send(sock, buf, strlen(buf),0);
//send 发送数据
memset(buf,0,sizeof(buf));
cnt = read(sock, buf, sizeof(buf));
//读取数据
printf("Client got message:[%d]%s\n", cnt,buf);
exit(0);
}
import socket
import time
if __name__ == '__main__':
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(('192.168.111.45',5000))
sock.send('send message to server'.encode())
print( sock.recv(1024))
sock.close()
import socket
import os
import time
if __name__ == '__main__':
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
sock.bind(("192.168.111.45",5000))
sock.listen(5)
while True:
connection, address = sock.accept()
print(connection, address)
try:
connection.settimeout(5)
buf =connection.recv(1024)
print( buf )
connection.send("send message to client".encode())
except socket.timeout:
print( 'time out')
connection.close()
sock.close()
简单sock示例程序的更多相关文章
- ROS indigo安装完成后运行小乌龟示例程序
安装ROS成功后,在Beginner Tutorials中有一个简单的示例程序. 在Terminal中运行以下命令:$ roscore新开一个terminal,运行以下命令,打开小乌龟窗口:$ ros ...
- ROS 安装完成后运行小乌龟示例程序
安装ROS成功后,在Beginner Tutorials中有一个简单的示例程序. 在Terminal中运行以下命令: $ roscore 新开一个terminal,运行以下命令,打开小乌龟窗口: $ ...
- ACEXML解析XML文件——简单示例程序
掌握了ACMXML库解析XML文件的方法后,下面来实现一个比较完整的程序. 定义基本结构 xml文件格式如下 <?xml version="1.0"?> <roo ...
- 一个简单的JSP程序示例
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
- android示例:一个简单的登陆程序
最近写了个简单的登陆程序,有几点收获: 1.懂得如何在LinearLayout中嵌套LinearLayout,完善布局的行列: 2.用android:layout_weight控制控件的比重: 3.用 ...
- Socket编程指南及示例程序(转)
1 前言 在一些常用的编程技术中,Socket网络编程可以说是最简单的一种.而且Socket编程需要的基础知识很少,适合初学者学习网络编程.目前支持网络传输的技术.语言和工具繁多,但是 ...
- .NET跨平台:在Ubuntu上用自己编译的dnx运行ASP.NET 5示例程序
在 Linux Ubuntu 上成功编译 dnx 之后,会在 artifacts/build/ 文件夹中生成 dnx-coreclr-linux-x64/ 与 dnx-mono/ 这2个文件夹,前者是 ...
- Salesforce Apex 使用JSON数据的示例程序
本文介绍了一个在Salesforce Apex中使用JSON数据的示例程序, 该示例程序由以下几部分组成: 1) Album.cls, 定了了封装相关字段的数据Model类 2) RestClient ...
- Socket编程实践(3) 多连接服务器实现与简单P2P聊天程序例程
SO_REUSEADDR选项 在上一篇文章的最后我们贴出了一个简单的C/S通信的例程.在该例程序中,使用"Ctrl+c"结束通信后,服务器是无法立即重启的,如果尝试重启服务器,将被 ...
- BitCoinJ之Hello World示例程序
简介 比特币(BitCoin)是一种基于区块链(BlockChain)技术的数字化货币. 本文介绍了使用基于Java语言的BitCoinJ API实现一个简单的收取和支付比特币的示例程序. 开发环境 ...
随机推荐
- LLM中的Top-K/Top-p/温度都是怎么发挥作用的?
写在前面 许多大模型具有推理参数,用于控制输出的"随机性".常见的几个是 Top-K.Top-p,以及温度.比如我们常用的 Dify 平台就支持 Top-p 和 温度 的设置: 鼠 ...
- MySQL 中如何解决深度分页的问题?
MySQL 中如何解决深度分页的问题? 在 MySQL 中,深度分页是指查询数据时,用户请求的是数据集中的较后部分,而不是从头开始的数据.这类分页查询常见于有大量数据的系统中,当页数很大时,查询效率会 ...
- 解决微信二维码接口接口返回:errcode\":47001,\"errmsg\":\"data format error rid: xxx和处理返回的buffer的问题
data format error rid问题: 在php中使用curl调用微信二维码生成接口getwxacodeunlimit时得到错误响应信息: errcode\":47001,\&qu ...
- 从车道检测项目入门open cv
从车道检测项目入门open cv 前提声明:非常感谢b站up主 嘉然今天吃带变,感谢其视频的帮助.同时希望各位大佬积积极提出宝贵的意见.(❁´◡`❁)(●'◡'●)╰(°▽°)╯ github地址:h ...
- K8s新手系列之Pod的重启策略
概述 K8s中Pod的重启策略具有确保服务连续性.保证任务完整性.提升资源利用效率.便于故障排查的作用 Pod的重启策略可以根据restartPolicy字段定义. 重启策略适用于pod对象中的所有容 ...
- 【笔记】reko 0.10.2 反编译工具安装和使用记录|(1) README.md
(翻译自README.md,并通过自己的实际操作情况重新整理了一遍) 笔者注:我已经成功地根据README.md下载了Release版本,也自己试了下从源码编译,跟着README都挺顺利的.如果操作过 ...
- TensorFlow 基础 (02)
前面对 tensorflow 的基础数据类型, 数值, 字符串, 布尔等, 有初步认识,尤其是重点的 tensor 张量, 包含了, 标量, 向量, 矩阵 ... 这样的基本概念. 我现在回过头来看, ...
- 卷积神经网络CNN 初识
Network 之前将人工神经网络的 BP算法给详细推导了2遍, 算是对神经网络有了一个初步的认识, 当然, 重点还是算法的推导, 从数学的角度看, 就是多元复合函数求偏导, 应用链式法则 而已, 思 ...
- 三-select模型
select模型是对简单C/S模型的优化,他解决了accept函数阻塞等待连接的问题.并且允许应用程序同时监视多个套接字,从而实现简单的并发请求.通过调用select函数确认一个或多个套接字当前的状态 ...
- AutoCAD 逆向工程中 Shx 字体文件解析
数据格式相关的文章 https://wenku.baidu.com/view/8abbfc33eefdc8d376ee32a1.html 代码实现 https://blog.csdn.net/qq_2 ...