在C语言中就学过scanf和printf,其实理解socket就跟这两个输入输出差不多,只不过是信息的传输而已。

1.TCP服务器端(server)的默认函数调用顺序:

按照上述的调用顺序,我们可以来写个最简单的"hello world" server程序。

 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h> void error_handling(char* message); void error_handling(char* message) {
fputs(message, stderr);
fputc('\n', stderr);
exit();
} int main(int argc, char **argv)
{
int serv_sock;
int clnt_sock; //设置一个server地址serv_addr,client地址clnt_addr
struct sockaddr_in serv_addr;
struct sockaddr_in clnt_addr;
socklen_t clnt_addr_size = sizeof(clnt_addr); memset(&serv_addr, , sizeof(serv_addr));
memset(&serv_addr, , sizeof(serv_addr));
char message[] = "Hello world"; if (argc != ) {
printf("Usage : %s <port>\n", argv[]);
exit();
} //创建用于internet的流协议(TCP)socket
serv_sock = socket(PF_INET, SOCK_STREAM, );
if (serv_sock == -) {
error_handling("socket() error");
} serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(atoi(argv[])); //把socket和socket地址结构联系起来
if( bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) == -) {
error_handling("bind() error");
} //server_socket用于监听
if ( listen(serv_sock, ) == -) {
error_handling("lisen() error");
} // 受理连接请求
clnt_sock = accept(serv_sock,(struct sockaddr*)&clnt_addr,&clnt_addr_size);
if ( clnt_sock == -) {
error_handling("accept() error");
} write(clnt_sock, message, sizeof(message));
close(clnt_sock);
close(serv_sock); return ;
}

2.与server端相对应的是客户端,其调用顺序为:

相对应的“hello world”client端程序就为:

 hello_client.c
------
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h> void error_handling(char* message); void error_handling(char* message) {
fputs(message, stderr);
fputc('\n', stderr);
exit();
} int main(int argc, char **argv) {
int sock;
struct sockaddr_in serv_addr;
char message[];
int str_len;
memset(&serv_addr, , sizeof(serv_addr)); if (argc != )
{
printf("Usage: /%s <IP> <Port>\n",argv[]);
exit();
} //创建用于internet的流协议(TCP)socket
sock = socket(PF_INET, SOCK_STREAM, );
if (sock == -) {
error_handling("socket() error");
} //设置一个socket地址结构client_addr,代表客户机internet地址, 端口
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[]);
serv_addr.sin_port = htons(atoi(argv[])); //把socket和socket地址结构联系起来
if( connect(sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) == -) {
error_handling("connect() error");
} str_len = read(sock, message, sizeof(message) - );
if (str_len == -) {
error_handling("read() error");
} printf("Message from server : %s \n", message);
close(sock);
return ;
}

开始运行服务器端:

#gcc hello_server.c -o hserver
#./hserver
......开始挂起

开始运行客户端:

#gcc hello_client.c -o hclient
#./hclient 127.0.0.1
Message from server: Hello world

[000]socket通信--server和client实现的简单例子的更多相关文章

  1. [001]socket通信--server和client实现迭代的简单例子

    server端: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unist ...

  2. libevent 实现的socket 通信 server以及解决找不到动态库的方法

    注: client 个人觉得没必要用 libvent来实现就没写 注:由于 涉及到回调函数的使用 如有疑惑的可以先去了解回调函数的实现机理 先来说一下 libevent主要是干啥的 : 内部封装了 s ...

  3. java 记录一下socket的server与client

    package com.test.server; import java.io.IOException; import java.net.ServerSocket; import org.apache ...

  4. Python中Socket编程server与client简单的合法性认证

    导入python自带的hmac模块对随机生成的位数32字节和自定义token进行加密处理 import osmsg = os.urandom(32)  #随机生成msgOut[4]: b"F ...

  5. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  6. Android简单实现Socket通信,client连接server后,server向client发送文字数据

    案例实现的是简单的Socket通信,当client(Androidclient)连接到指定server以后,server向client发送一句话文字信息(你能够拓展其他的了) 先看一下服务端程序的实现 ...

  7. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  8. day36——死锁、递归锁、信号量、GIL、多线程实现socket通信、线程池和进程池

    day36 死锁现象与递归锁 死锁现象 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这 ...

  9. Python socket 通信功能简介

    常用的地址家族AF_UNIX:基于文件,实现同一主机不同进程之间的通信AF_INET:基于网络,适用于IPv4AF_INET6:基于网络,使用于IPv6 常见的连接类型SOCK_STREAM:即TCP ...

随机推荐

  1. Logminer实战

    相信许多DBA同学都曾遇到过这种情况,由于各种各样的原因,必须对数据库做不完全恢复:但又不确定应该恢复到哪个时间点或SCN才合适,因而反复的执行不完全恢复,悲剧掉了一地,中枪的有木有?温馨提示下,在生 ...

  2. Js计算-当月每周有多少天

    查看Demo: 源代码如下: <script> //计算当月总天数 function getCountDays() { var curDate = new Date(); /* 获取当前月 ...

  3. 使用busybox制作rootfs

    Build Busybox as a static binary(no shared libs),如果选择上,则busybox将以静态形式进行编译,否则将以动态方式编译.此外,还需要对交叉编译环境进行 ...

  4. spring exception--No unique bean of type

    今天碰到一个问题,就是我现有项目需要加一个定时器任务,我的代码如下: <!-- 每日数据同步 总数监测任务******************begin --> <bean id=& ...

  5. 扩展类加载器-------改变JAVA的父优先类加载顺序

    java的类加载机制默认情况下是采用委托模型:当加载某个类时JVM会首先尝试用当前类加载器的父类加载器加载该类,若父类加载器加载不到再由当前类加载器来加载,因此这种模型又叫做“父优先”模型. 但是在实 ...

  6. 《深入Java虚拟机学习笔记》- 第10章 栈和局部变量操作

    Java栈和局部变量操作 Java虚拟机是基于栈的机器,几乎所有Java虚拟机的指令都与操作数栈相关.栈操作包括把常量压入操作数栈.执行通用的栈操作.在操作数栈和局部变量之间往返传输值. 1常量入栈操 ...

  7. Base-Android快速开发框架(五)--网络操作之RequestModel、ResponeModel、CustomAsyncHttpClient

    在正式介绍CustomAsyncHttpClient之前,刚好最近有一个朋友找我帮忙给他们看下一个APP.我先上一段代码截图.一段检测版本更新的接口代码.

  8. class0513(html)

    精通DIV+CSS Meta 1.div span 2.三种样式表 内联样式(行内样式) 嵌入样式 外部样式 就近原则 3.常见样式 复合样式background border css单位 % px ...

  9. List 接口以及实现类和相关类源码分析

    List 接口以及实现类和相关类源码分析 List接口分析 接口描述 用户可以对列表进行随机的读取(get),插入(add),删除(remove),修改(set),也可批量增加(addAll),删除( ...

  10. Use ALTER DATABASE to Move Databases

    Use ALTER DATABASE to Move Databases Follow Our Daily Tips •facebook.com/TechNetTips• twitter.com/Te ...