- IP地址转化函数
#include <arpa/inet.h>
in_addr_t inet_addr(const char* strptr);
int inet_aton (const char* cp,struct in_addr* inp);
char* inet_ntoa(struct in_addr in);
- 主机/网络字节序
#include <netinet/in.h>
unsigned long int htonl(unsigned long int hostlong);
unsigned short int htons(unsigned short int hostshort);
unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsigned short int netshort);
- 数据读写API
(1)TCP
(2)UDP
- 网络信息API
gethostbyname 根据主机名称获取主机的完整信息
gethostbyaddr 根据IP地址获取主机的完整信息
#include <netdb.h>
struct hostent* gethostbyname (const char * name);
struct hostent* gethostbyaddr (const void* addr,size_t len,int type);
/***************************
name 参数指定目标主机的主机名
addr 参数指定目标主机的IP地址
len 参数指定addr 所指的IP地址的长度
type 参数指定addr所指的IP地址的类型
***************************/
- 流程图
server
(1) socket
//服务器IP + PORT
struct sockaddr_in serverAddr;
serverAddr.sin_family = PF_INET;
serverAddr.sin_port = htons(SERVER_PORT); // 转换端口
serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP); // 转换IP
// 创建监听socket
int listener = socket(PF_INET, SOCK_STREAM, 0);
(2). bind
// 绑定地址
bind(listener, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0
(3). listen
// 监听
int ret = listen(listener,5);
(4)accept
(5) recv
(6) send
(7) close
// 关闭socket
close(listener);
- client
(1)socket
// 创建socket
int sock = socket(PF_INET, SOCK_STREAM, 0);
(2)connect
// 发起连接
connect(sock, (struct sockaddr *)&serverAddr, sizeof(serverAddr))
(3)send
// 将信息发送给服务器
send(sock, message, BUF_SIZE, 0);
(4)close
//关闭socket
close(sock);
由此一个简单C/S框架(基本的组成)
服务器编程框架:
附:一个完整的tcp通讯小程序
// server
// 简单示例
#include <sys/socket.h>
#include <netinet.h>
#include <arpa/inet.h>
#include <assert.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
int main(int argc, char **argv)
{
int listenfd, connfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in cliaddr, servaddr;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
listen(listenfd, LISTENQ);
for ( ; ; ) {
clilen = sizeof(cliaddr);
connfd = accept(listenfd, (SA *) &cliaddr, &clilen);
if ( (childpid = fork()) == 0) { /* child process */
close(listenfd); /* close listening socket */
str_echo(connfd); /* process the request */
exit(0);
}
close(connfd); /* parent closes connected socket */
}
}
// client
// 简单示例
#include <sys/socket.h>
#include <netinet.h>
#include <arpa/inet.h>
#include <assert.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
int main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in servaddr;
if (argc != 2)
err_quit("usage: tcpcli <IPaddress>");
sockfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
connect(sockfd, (SA *) &servaddr, sizeof(servaddr));
str_cli(stdin, sockfd); /* do it all */
exit(0);
}