在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. java问题若干

    1.Java处理本身包含双引号的String 解决:使用转义字符.如:String str = "select * from \"TAB_catalog\" " ...

  2. expunge

    expunge 擦掉: 除去: 删去: 消除 1. The experience was something he had tried to expunge from his memory. 他曾努力 ...

  3. 求大于整数m且紧靠m的k个素数 及 判断一个数是否为素数的方法

    题目: 请编写一个函数void fun(int m,int k ,int xx[]),该函数的功能是:将大于整数m且紧靠m的k个素数存入xx所指的数组中. 例如,若输入:17,5,则应输出:19,23 ...

  4. 【工具类】获取手机sim卡的运营商

    加入权限:<uses-permission android:name="android.permission.READ_PHONE_STATE" /> package ...

  5. Delphi 打印

    procedure TForm1.PrinterSetupExecute(Sender: TObject);begin PrinterSetupDialog1.Execute;end; procedu ...

  6. HDU 5690 All X 暴力循环节

    分析:暴力找循环节就好了 #include <iostream> #include <cstdio> #include <cstdlib> #include < ...

  7. java快速获取大图片的分辨率(大图片格式JPG,tiff ,eg)

    问题描述:怎样快速获取一个20MB图片的分辨率? 程序代码: package test; import java.awt.Dimension; import java.awt.image.Buffer ...

  8. 全文检索- Oracle/MySql/达梦

    简单使用语法: MySql: ALTER TABLE dataset_ods ENGINE = MyISAM; //5.6后的InnoDB支持全文索引 ALTER TABLE dataset_ods ...

  9. 【转】Linux 技巧: Bash 参数和参数扩展

    重点看下清单7 现在,很多 Linux® 和 UNIX® 系统上都有 bash shell,它是 Linux 上常见的默认 shell.通过本文,您将了解到如何在 bash 脚本中处理参数和选项,以及 ...

  10. 关于 Java Collections API 您不知道的 5 件事,第 1 部分

    定制和扩展 Java Collections Java™ Collections API 远不止是数组的替代品,虽然一开始这样用也不错.Ted Neward 提供了关于用 Collections 做更 ...