Linux下简单的socket通信实例

Linux下简单的socket通信实例

If you spend too much time thinking about a thing, you’ll never get it done.

—Bruce Lee

      学习网络编程也一段时间了,刚开始看《UNIX网络编程》的时候,觉得这本厚厚的书好难啊!看到后来,发现并没有想象中的那么难。如果你是新手,建议你看到第二部分结束后,开始着手写代码。不写代码肯定是不行的。看100遍也没有敲一遍实现一遍来的清楚。敲完以后,带着问题去看书,你会更加有针对性。提高的速度是飞快的,这也是学习任何一本书、一门语言的唯一手段。

我很希望和大家一起分享学习网络编程遇到的种种困难与不顺,也希望和大家一起讨论其中遇到的问题,一起成长,如果你刚开始打算学习网络编程,那这篇文章一定能给你一些帮助,我的邮箱:[email protected],转载请注明出处。

关于怎样介绍这个简单的实例

--> 1、代码展示,功能介绍

  --> 2、首先介绍一下客户端和服务端中函数的功能以及函数的原形。

  --> 3、关于连接三次握手和TCP连接关闭时候的分组交换

--> 4、IPv4、IPv6套接字的地址结构

  --> 5、一些好的学习网站总结

  --> 6、代码下载

client.c

 1  #include <stdio.h>
 2  #include <sys/socket.h>
 3  #include <sys/types.h>
 4  #include <stdlib.h>
 5  #include <netinet/in.h>
 6  #include <errno.h>
 7  #include <string.h>
 8  #include <arpa/inet.h>
 9  #include <unistd.h>
10  #define MAXLINE 1024
11  int main(int argc,char **argv)
12  {
13  char *servInetAddr = "127.0.0.1";
14  int socketfd;
15  struct sockaddr_in sockaddr;
16  char recvline[MAXLINE], sendline[MAXLINE];
17  int n;
18
19  if(argc != 2)
20  {
21  printf("client <ipaddress> \n");
22  exit(0);
23  }
24
25  socketfd = socket(AF_INET,SOCK_STREAM,0);
26  memset(&sockaddr,0,sizeof(sockaddr));
27  sockaddr.sin_family = AF_INET;
28  sockaddr.sin_port = htons(10004);
29  inet_pton(AF_INET,servInetAddr,&sockaddr.sin_addr)30  if((connect(socketfd,(struct sockaddr*)&sockaddr,sizeof(sockaddr))) < 0 )31  {
31  printf("connect error %s errno: %d\n",strerror(errno),errno);
32  exit(0);
33  }
34
35  printf("send message to server\n");
36
37  fgets(sendline,1024,stdin);
38
39  if((send(socketfd,sendline,strlen(sendline),0)) < 0)
40  {
41  printf("send mes error: %s errno : %d",strerror(errno),errno);
42  exit(0);
43  }
44
45  close(socketfd);
46  printf("exit\n");
47  exit(0);
48  }

-执行:gcc client.c -o client    后启动 ./client 客户端程序 启动前先启动./server-----------------------------------------

 server.c

 1  #include <stdio.h>
 2  #include <sys/socket.h>
 3  #include <sys/types.h>
 4  #include <string.h>
 5  #include <netinet/in.h>
 6  #include <stdlib.h>
 7  #include <errno.h>
 8  #include <unistd.h>
 9  #include <arpa/inet.h>
10
11  #define MAXLINE 1024
12  int main(int argc,char **argv)
13  {
14  int listenfd,connfd;
15  struct sockaddr_in sockaddr;
16  char buff[MAXLINE];
17  int n;
18
19  memset(&sockaddr,0,sizeof(sockaddr));
20
21  sockaddr.sin_family = AF_INET;
22  sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
23  sockaddr.sin_port = htons(10004);
24
25  listenfd = socket(AF_INET,SOCK_STREAM,0);
26
27  bind(listenfd,(struct sockaddr *) &sockaddr,sizeof(sockaddr));
28
29  listen(listenfd,1024);
30
31
32  printf("Please wait for the client information\n");
33
34  for(;;)
35  {
36  if((connfd = accept(listenfd,(struct sockaddr*)NULL,NULL))==-1)
37  {
38  printf("accpet socket error: %s errno :%d\n",strerror(errno),err no);
39  continue;
40  }
41
42  n = recv(connfd,buff,MAXLINE,0);
43  buff[n] = ‘\0‘;
44  printf("recv msg from client:%s",buff);
45  close(connfd);
46  }
47  close(listenfd);
48  }

-执行:gcc server.c -o server    后启动 ./server 服务端程序-------------------------------------------------------

   > 1、代码展示,功能介绍

   上面这个简单的socket通信的代码要实现的功能:从客户端发送一条消息后,服务端接收这条消息,并在服务端显示(recv msg from client:****)。

   

  > 2、首先介绍一下客户端和服务端中函数的功能以及函数的原形。 

    1  #include <sys/socket.h> 
    2  int socket(int family, int type, int protocol);   //指定期望的通信协议类型,返回的文件描述符和套接字描述符类似,我们成为套接字描述符,简称sockfd  

family:协议族

family 说明
AF_INET IPv4协议 
AF_INET6 IPv6
AF_LOCAL Unix域协议(15章)
AF_ROUTE  路由套接字(18章)
AF_KEY 密钥套接字(19章)

type:套接字的类型

type 说明
SOCK_STREAM(常用) 字节流套接字
SOCK_DGRAM 数据报套接字
SOCK_SEQPACKET  有序分组套接字
SOCK_RAW 原始套接字

protocol:协议类型的常量或设置为0,以选择给定的family和type组合的系统默认值

protocol 说明
IPPROTO_TCP TCP传输协议
IPPROTO_UDP UDP传输协议
IPPROTO_SCTP SCTP传输协议

  

#include<arpa/inet.h>
int inet_pton(int family,const char *strptr,void *addrptr);//成功返回1,格式不对返回0,出错返回-1//作用:p代表表达式 n代表数值  以后所写的所有代码中都有可能会需要这个函数,所以这个函数很重要//将char所指向的字符串,通过addrptr指针存放//他的反函数:  inet_ntop()作用相反。可以百度查阅这个函数的功能。因为例子里我们没有涉及到,就不介绍了。以后用到的时候再说//需要注意的是:当他发生错误的时候,errno的值会被置为EAFNOSUPPORT 关于errno值我们一会儿介绍。
#include <sys/socket.h>
int connect(int sockfd,const struct sockaddr* servadd,socklen_t addrlen);//用connect函数来建立与TCP服务器的连接

  > 3、关于连接三次握手和TCP连接关闭时候的分组交换

      > 4、IPv4、IPv6套接字的地址结构

  > 5、一些好的学习网站总结

  > 6、代码下载

时间: 2024-10-11 22:02:04

Linux下简单的socket通信实例的相关文章

Linux下进程间Socket通信调试debug方法

在一个复杂的软件系统中,往往需要有各个组件之间的数据传递,在组件间数据传递过程中,又会不可避免的出现一些小问题,这时候我们就需要来进行debug了,由于最近的一个系统使用到了collectd和rrdcached来收集数据和画图,它们之间采用了Unix socket通信,因此小小的学习了一下相关知识. 首先我们来回忆下Linux下进程通信有哪些方法: 管道(Pipe)及有名管道(FIFO)\UNIX BSD 信号(Signal) \UNIX BSD 报文消息队列(Message)\UNIX sys

Linux下的TCP Socket通信

一.socket函数 1.头文件: #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> 2.函数原型: int socket(int domain, int type, int protocol); socket函数类似于open,用来打开一个网络连接,如果成功则返回一个网络文件描述符(int类型),之后我们操作这个网络连接都通过这个网络文件描述符. dimain:域,网络域,网络地址范围(IPV4或IPV6

(8)Linux(客户端)和Windows(服务端)下socket通信实例

Linux(客户端)和Windows(服务端)下socket通信实例: (1)首先是Windows做客户端,Linux做服务端的程序 Windows   Client端 #include <stdio.h> #include <Windows.h> #pragma comment(lib, "ws2_32.lib") #define Port 5000 #define IP_ADDRESS "192.168.1.30"     //服务器地址

C# 如何实现简单的Socket通信(附示例)

上周由于有个项目需要用到网络通信这块,然后就花了点时间研究了一下,本来想上周就写出来的,但是突然要忙,所以等到现在. 话说对于网络通信,以前写C++的时候,天天面对着线程和Socket,所以换成C#也就没那么怕了,虽然C++下也没有掌握的多好,但毕竟只是一个小Demo,只作为了解一下过程. 自己写了一个服务端和一个客户端,刚开始比较简单,只是能达到连通,收发信息的目的,但是很粗糙.而后稍加改进呢~加上了多线程,所以能感觉更科学一些,不过自己真的很菜,代码写的不是很好看,下面分两个版本给大家表出来

一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载)

目录 一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载) Http协议简述 HttpRequest类设计 请求部分 接收部分 关于上传和下载 Cpp实现 关于源码中的Logger 使用示例 一个linux下简单的纯C++实现Http请求类(GET,POST,上传,下载) 最近写了点关于Http上传下载文件相关的,于是今天整理下代码. Http协议简述 HttpRequest类设计 使用示例 Http协议简述 协议:网络协议的简称,网络协议是通信计算机双方必须共同遵从

Linux下高并发socket最大连接数所受的各种限制(详解)

1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄).可使用ulimit命令查看系统允许当前用户进程打开的文件数限制: [[email protected] ~]$ ulimit -n1024 这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中

一个最简单的Socket通信例子

所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答网络请求.  Socket和ServerSocket类库位于java.net包中.ServerSocket用于服务器端,Socket是建立网络连接时使用的.在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话.对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别.不管是

Linux 下 简单客户端服务器通讯模型(TCP)

原文:Linux 下 简单客户端服务器通讯模型(TCP) 服务器端:server.c #include<stdio.h> #include<stdlib.h> #include<errno.h> #include<string.h> #include<sys/socket.h> #include<sys/types.h> #include <stdio.h> #include <unistd.h> #inclu

网络协议栈学习(一)socket通信实例

网络协议栈学习(一)socket通信实例 该实例摘自<linux网络编程>(宋敬彬,孙海滨等著). 例子分为服务器端和客户端,客户端连接服务器后从标准输入读取输入的字符串,发送给服务器:服务器接收到字符串后,发送给服务器:服务器接收到字符串后统计字符串的长度,然后将该值传给客户端:客户端将接收到的信息打印到标准输出. 一.服务器端代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #in