学习socket(一) TCP简单聊天程序
2017-04-25 21:21
579 查看
1.储备知识
1.网络字节序和主机字节序的转化
#include <netinet/in.h> /* 主机字节序转化成网络字节序 */ uint16_t htons(uint16_t host16bitvalue); uint32_t htonl(uint32_t host32bitvalue); 返回网络字节序的值 /* 网络字节序转化成主机字节序 */ uint16_t ntohs(uint_16 net16bitvalue); uint32_t ntohl(uint_32 net32bitvalue); 返回主机字节序的值
2.字节操纵函数
#include <string.h> /* 将字符串dest中指定bnytes数目的字节置为零 */ void bzero(void *dest, size_t nbytes);
3.socket套接字
创建socket套接字#include <sys/socket.h> int socket(int family, int type, int protocol); 返回:若成功则返回文件socket文件描述符,若出错返回-1参数说明:
family: 协议族
type: 套接字类型
protocol: 协议类型常值
#incldue <netinet/in.h> #include <sys/socket.h> /* 为socket套接字绑定IP和端口 */ int bind(int sockfd, struct sockaddr *addr, socklen_t len); 返回:成功返回0,出错返回-1 /* 接受连接 */ int accept(int sockfd, struct sockaddr *addr, socklen_t len); 返回:成功返会非负描述符,出错返回-1 /* 建立与指定socket的连接 */ int connect(int sockfd, struct sockaddr *addr, socklen_t len); 返回:成功返回0,出错返回-1
struct sockaddr_in类型与struct sockaddr类型
#include <netinet/in.h> struct sockaddr_in { uint_8 sin_len; //结构体的长度 sa_family_t sin_family; //协议族 in_port_t sin_port; //端口号 struct in_addr sin_addr; //32为IP地址 char sin_zero[8]; //一般设置为0,不知 } struct in_addr { in_addr_t s_addr; //32为IP地址 }
#include <sys/socket.h> struct sockaddr { uint_8 sa_ len; sa_family_t sa_family; char sa_data[14]; }struct sockaddr_in 可以强制转化成sockaddr;
让socket监听网络
#include <sys/socket.h> int listen(int sockfd, int backlog);
关闭socket套接字
#include <unistd.h> /* 关闭一个文件描述符 */ int close(int fd);
4.简单的c/s模型
服务器端客户端
创建socket套接字 创建socket套接字
绑定IP和端口 绑定IP和端口
让该socket监听网络 可选择是否监听
接受连接 向主机发起连接
发送/接受数据包 发送/接受数据包
关闭连接 关闭连接
5.简单实例
服务器端
/* server.c */ #include <stdio.h> #include <sys/socket.h> #include <errno.h> #include <unistd.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/wait.h> #define MAXBUF 1024 int main() { int pid; int sockfd, new_fd; socklen_t len; struct sockaddr_in my_addr, their_addr; char buf[MAXBUF + 1]; sockfd = socket(AF_INET, SOCK_STREAM, 0 ); if (sockfd < 0) { perror("socket"); exit(errno); } printf("socket create \n"); bzero(&my_addr, sizeof(my_addr)); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(2367); my_addr.sin_addr.s_addr = INADDR_ANY; if ( (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))) == -1 ) { perror("bind"); exit(errno); } listen(sockfd, 10); printf("wait for connect \n"); len = sizeof(struct sockaddr); if ( (new_fd = accept(sockfd, (struct sockaddr*)&their_addr, &len)) == -1 ) { perror("accept"); exit(errno); } else { printf("server: got connection from %s, port %d, socket %d\n", inet_ntoa(their_addr.sin_addr), ntohs(their_addr.sin_port), new_fd); } close(new_fd); close(sockfd); return 0; }
客户端
/* client.c */ #include <stdio.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <netinet/in.h> #include <sys/socket.h> #include <unistd.h> #include <arpa/inet.h> #include <errno.h> #include <sys/wait.h> #define MAXBUF 1024 int main() { int sockfd, len; struct sockaddr_in dest; char buf[MAXBUF + 1]; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("socker"); exit(errno); } printf("sockfd create\n"); bzero(&dest, sizeof(dest)); dest.sin_family = AF_INET; dest.sin_port = htons(2367); dest.sin_addr.s_addr = inet_addr("127.0.0.1"); if ( connect(sockfd, (struct sockaddr *)&dest, sizeof(dest)) == -1 ) { perror("connect"); exit(errno); } printf("server connect\n"); close(sockfd); return 0; }
运行结果:
相关文章推荐
- c#网络编程学习笔记02_Tcp编程(中)_简单的同步tcp聊天程序
- P2P聊天程序,学习TcpListener/TcpClient/Socket用法
- java用socket和serversocket实现一对一聊天(java实现简单的TCP聊天程序)
- 【java学习记录】12.用Socket网络访问方法,实现简单的网络聊天程序
- linux下socket实现TCP通信的简单程序接口封装
- 基于socket的简单聊天程序(三)
- java Socket ServerSocket 聊天程序 。 太简单的程序了
- linux下基于TCP简单的socket通信程序
- 用Socket做简单聊天程序(VB.net)
- 一个简单的socket通信聊天程序
- 简单的Tcp点对点聊天程序
- Delphi简单TCP聊天程序(二):双向传输
- [Java] Socket/ServerSocket 控制台简单聊天程序
- c# WINFORM SOCKET编程-简单聊天程序(服务端)
- 用Socket做简单聊天程序(VB.net)
- 简单的Socket聊天程序(客户端)
- 基于socket的简单聊天程序(二)
- 用Socket建立个最简单的聊天程序
- 基于Socket简单的聊天程序
- iPhone网络编程初体验-简单的聊天程序(适合新手学习客户端服务器交互)