1. TCP通讯模型

2. 服务器端

① 创建socket,用函数socket()

② 绑定IP地址、端口号等信息到socket上,用函数bind()

③ 设置允许的最大连接数,用函数listen()

④ 等待来自客户端的连接请求,用函数accept()

⑤ 收发数据,用函数send()和recv(),或者read()和write()

⑥ 关闭网络连接,用函数close()

3. 客户端

① 创建一个socket,用函数socket()

② 设置要连接的服务器的IP地址和端口的属性

③ 连接服务器,用函数connect()

④ 收发数据,用函数send()和recv(),或者read()和write()

⑤ 关闭网络连接,用函数close()

4. 简单示例

① 服务器端

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h> #define portnumber 3333 int main(int argc, char *argv[])
{
int sockfd, new_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size;
int nbytes;
char buffer[]; /* 服务程序建立sockfd描述符 */
if((sockfd = socket(AF_INET, SOCK_STREAM, )) == -) // AF_INET:IPV4;SOCK_STREAM:TCP
{
fprintf(stderr, "Socket error:%s\n\a", strerror(errno));
exit();
} bzero(&server_addr, sizeof(struct sockaddr_in)); // 初始化,置0 server_addr.sin_family = AF_INET; // Internet
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // (将本机器上的long数据转化为网络上的long数据)服务器程序能运行在任何ip的主机上
//INADDR_ANY 表示主机可以是任意IP地址,即服务器程序可以绑定到所有的IP上
//server_addr.sin_addr.s_addr=inet_addr("192.168.1.1"); //用于绑定到一个固定IP,inet_addr用于把数字加格式的ip转化为整形ip server_addr.sin_port = htons(portnumber); // (将本机器上的short数据转化为网络上的short数据)端口号 /* 捆绑sockfd描述符到IP地址 */
if(bind(sockfd,(struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -)
{
fprintf(stderr, "Bind error:%s\n\a", strerror(errno));
exit();
} /* 设置允许连接的最大客户端数 */
if(listen(sockfd, ) == -)
{
fprintf(stderr, "Listen error:%s\n\a", strerror(errno));
exit();
} while()
{
/* 服务器阻塞,直到客户程序建立连接 */
sin_size = sizeof(struct sockaddr_in);
if((new_fd = accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size)) == -)
{
fprintf(stderr,"Accept error:%s\n\a",strerror(errno));
exit();
} fprintf(stderr, "Server get connection from %s\n", inet_ntoa(client_addr.sin_addr)); // 将网络地址转换成.字符串
if((nbytes = read(new_fd, buffer, )) == -)
{
fprintf(stderr, "Read Error:%s\n", strerror(errno));
exit();
} buffer[nbytes] = '\0';
printf("Server received %s\n",buffer); /* 这个通讯已经结束 */
close(new_fd);
/* 循环下一个 */
} /* 结束通讯 */
close(sockfd);
exit();
}

② 客户端

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h> #define portnumber 3333 int main(int argc, char *argv[])
{
int sockfd;
char buffer[];
struct sockaddr_in server_addr;
struct hostent *host; if(argc != )
{
fprintf(stderr, "Usage:%s hostname \a\n", argv[]);
exit();
} /* 使用hostname查询host名字 */
if((host = gethostbyname(argv[])) == NULL)
{
fprintf(stderr, "Gethostname error\n");
exit();
} /* 客户程序建立sockfd描述符 */
if((sockfd = socket(AF_INET,SOCK_STREAM,)) == -) // AF_INET:Internet;SOCK_STREAM:TCP
{
fprintf(stderr, "Socket Error:%s\a\n", strerror(errno));
exit();
} /* 客户程序填充服务端的资料 */
bzero(&server_addr, sizeof(server_addr)); // 初始化,置0 server_addr.sin_family = AF_INET; // IPV4
server_addr.sin_port = htons(portnumber); // (将本机器上的short数据转化为网络上的short数据)端口号
server_addr.sin_addr = *((struct in_addr *)host->h_addr); // IP地址 printf("host->h_addr = 0x%x\n", *((struct in_addr *)host->h_addr));
printf("server_addr.sin_addr = 0x%x\n", server_addr.sin_addr); /* 客户程序发起连接请求 */
if(connect(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr))==-)
{
fprintf(stderr, "Connect Error:%s\a\n", strerror(errno));
exit();
} /* 连接成功了 */
printf("Please input char:\n"); /* 发送数据 */
fgets(buffer, , stdin); write(sockfd, buffer, strlen(buffer)); /* 结束通讯 */
close(sockfd);
exit();
}

最新文章

  1. 【poj1742】 Coins
  2. Android驱动开发之Hello实例
  3. java Class对象
  4. Web App开发入门
  5. 【Linux】一个简单的线程创建和同步的例子
  6. C# - CSV file reader
  7. SonarQube和Maven的集成
  8. AtomicInteger类的使用
  9. centos docker 升级至最新稳定版--摘自官网
  10. Spring MVC学习step1——框架熟悉
  11. 【python】获取http响应
  12. java常用实用类
  13. Android 修改应用图标(Android Studio)
  14. 《精通Spring 4.x 企业应用开发实战》学习笔记
  15. BZOJ1968 [Ahoi2005]COMMON 约数研究 数论
  16. 小程序返回顶部top滚动
  17. linux中eth0原何变成了eth1
  18. go语言之进阶篇接口转换
  19. Chapter2(变量和基础类型)--C++Prime笔记
  20. 希尔密码(Hill Cipher)的实现

热门文章

  1. ListView里面adapter的不同分类的item
  2. 框架之Struts2
  3. Swing界面组件的通用属性
  4. (转)C++中使用C代码
  5. c++正确处理 is-a has-a关系
  6. noi.ac day6t1 queen
  7. ubuntu16.04.2安装tftp服务器
  8. SDUT 3401 数据结构实验之排序四:寻找大富翁.!
  9. 3.内网渗透之reGeorg+Proxifier
  10. Winform定时启动