转载与修改

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示例程序的更多相关文章

  1. ROS indigo安装完成后运行小乌龟示例程序

    安装ROS成功后,在Beginner Tutorials中有一个简单的示例程序. 在Terminal中运行以下命令:$ roscore新开一个terminal,运行以下命令,打开小乌龟窗口:$ ros ...

  2. ROS 安装完成后运行小乌龟示例程序

    安装ROS成功后,在Beginner Tutorials中有一个简单的示例程序. 在Terminal中运行以下命令: $ roscore 新开一个terminal,运行以下命令,打开小乌龟窗口: $ ...

  3. ACEXML解析XML文件——简单示例程序

    掌握了ACMXML库解析XML文件的方法后,下面来实现一个比较完整的程序. 定义基本结构 xml文件格式如下 <?xml version="1.0"?> <roo ...

  4. 一个简单的JSP程序示例

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

  5. android示例:一个简单的登陆程序

    最近写了个简单的登陆程序,有几点收获: 1.懂得如何在LinearLayout中嵌套LinearLayout,完善布局的行列: 2.用android:layout_weight控制控件的比重: 3.用 ...

  6. Socket编程指南及示例程序(转)

    1         前言 在一些常用的编程技术中,Socket网络编程可以说是最简单的一种.而且Socket编程需要的基础知识很少,适合初学者学习网络编程.目前支持网络传输的技术.语言和工具繁多,但是 ...

  7. .NET跨平台:在Ubuntu上用自己编译的dnx运行ASP.NET 5示例程序

    在 Linux Ubuntu 上成功编译 dnx 之后,会在 artifacts/build/ 文件夹中生成 dnx-coreclr-linux-x64/ 与 dnx-mono/ 这2个文件夹,前者是 ...

  8. Salesforce Apex 使用JSON数据的示例程序

    本文介绍了一个在Salesforce Apex中使用JSON数据的示例程序, 该示例程序由以下几部分组成: 1) Album.cls, 定了了封装相关字段的数据Model类 2) RestClient ...

  9. Socket编程实践(3) 多连接服务器实现与简单P2P聊天程序例程

    SO_REUSEADDR选项 在上一篇文章的最后我们贴出了一个简单的C/S通信的例程.在该例程序中,使用"Ctrl+c"结束通信后,服务器是无法立即重启的,如果尝试重启服务器,将被 ...

  10. BitCoinJ之Hello World示例程序

    简介 比特币(BitCoin)是一种基于区块链(BlockChain)技术的数字化货币. 本文介绍了使用基于Java语言的BitCoinJ API实现一个简单的收取和支付比特币的示例程序. 开发环境 ...

随机推荐

  1. LLM中的Top-K/Top-p/温度都是怎么发挥作用的?

    写在前面 许多大模型具有推理参数,用于控制输出的"随机性".常见的几个是 Top-K.Top-p,以及温度.比如我们常用的 Dify 平台就支持 Top-p 和 温度 的设置: 鼠 ...

  2. MySQL 中如何解决深度分页的问题?

    MySQL 中如何解决深度分页的问题? 在 MySQL 中,深度分页是指查询数据时,用户请求的是数据集中的较后部分,而不是从头开始的数据.这类分页查询常见于有大量数据的系统中,当页数很大时,查询效率会 ...

  3. 解决微信二维码接口接口返回:errcode\":47001,\"errmsg\":\"data format error rid: xxx和处理返回的buffer的问题

    data format error rid问题: 在php中使用curl调用微信二维码生成接口getwxacodeunlimit时得到错误响应信息: errcode\":47001,\&qu ...

  4. 从车道检测项目入门open cv

    从车道检测项目入门open cv 前提声明:非常感谢b站up主 嘉然今天吃带变,感谢其视频的帮助.同时希望各位大佬积积极提出宝贵的意见.(❁´◡`❁)(●'◡'●)╰(°▽°)╯ github地址:h ...

  5. K8s新手系列之Pod的重启策略

    概述 K8s中Pod的重启策略具有确保服务连续性.保证任务完整性.提升资源利用效率.便于故障排查的作用 Pod的重启策略可以根据restartPolicy字段定义. 重启策略适用于pod对象中的所有容 ...

  6. 【笔记】reko 0.10.2 反编译工具安装和使用记录|(1) README.md

    (翻译自README.md,并通过自己的实际操作情况重新整理了一遍) 笔者注:我已经成功地根据README.md下载了Release版本,也自己试了下从源码编译,跟着README都挺顺利的.如果操作过 ...

  7. TensorFlow 基础 (02)

    前面对 tensorflow 的基础数据类型, 数值, 字符串, 布尔等, 有初步认识,尤其是重点的 tensor 张量, 包含了, 标量, 向量, 矩阵 ... 这样的基本概念. 我现在回过头来看, ...

  8. 卷积神经网络CNN 初识

    Network 之前将人工神经网络的 BP算法给详细推导了2遍, 算是对神经网络有了一个初步的认识, 当然, 重点还是算法的推导, 从数学的角度看, 就是多元复合函数求偏导, 应用链式法则 而已, 思 ...

  9. 三-select模型

    select模型是对简单C/S模型的优化,他解决了accept函数阻塞等待连接的问题.并且允许应用程序同时监视多个套接字,从而实现简单的并发请求.通过调用select函数确认一个或多个套接字当前的状态 ...

  10. AutoCAD 逆向工程中 Shx 字体文件解析

    数据格式相关的文章 https://wenku.baidu.com/view/8abbfc33eefdc8d376ee32a1.html 代码实现 https://blog.csdn.net/qq_2 ...