- 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);
}