Socket
当通信过程不相关且不共享文件系统时,可以采用何种机制?这就需要一个通用的传输层通信子系统驻留在每个参与通信的主机上,如TCP/IP。TCP/IP是Internet上使用的通用消息传输协议族。该子系统将网络上的一个端点的消息路由并传递到另一个端点。Unix套接字接口是一种将程序的地址空间(a socket)中的引用对象与底层消息传输子系统中的通信端点(a port)绑定的方式,以实现在网络软件连接的端点之间进行消息传递。
在网络通信中,服务器首先创建一个本地套接字,并将其绑定到通信子系统中唯一的端口地址。然后,它告诉通信,使这成为一个侦听端口,以便它可以创建一个相关的请求队列。然后,服务器等待进入的连接。客户端创建一个本地套接字,并要求通信子系统使用服务器的已知端口号将其套接字连接到远程服务器。每个被接受的连接建立一个新的临时服务器端套接字,用于处理特定的客户机/服务器交换。例如,允许多个线程使用相同的服务器端口号处理与客户端的独立连接。
连接被接受和建立后,通信通过写入客户端的本地套接字进行,数据通过网络被TCP/IP透明地携带,并可通过另一端的服务器套接字接收。服务器解析并作用于请求,然后可以将响应写入自己的套接字并关闭连接。然后将响应返回给客户端在TCP/IP协议下,客户端将从其套接字中读取响应,然后关闭其侧的连接。
实现消息交换的Socket接口的基本调用序列。
TCP
TCP 服务端步骤
记得配置好gcc,gcc使用可参考:gcc与Makefile
/*************** Server Code ****************/
#include <stdio.h> /* for printf() and fprintf() */
#include <sys/socket.h> /* for socket(), bind(), and connect() */
#include <arpa/inet.h> /* for sockaddr_in and inet_ntoa() */
#include <stdlib.h> /* for atoi() and exit() */
#include <string.h> /* for memset() */
#include <unistd.h> /* for close() */
#define MAXPENDING 5 /* Maximum outstanding connection requests */
#define RCVBUFSIZE 32 /* Size of receive buffer */
int main(int argc, char *argv[])
{
int servSock; /* Socket descriptor for server */
int clntSock; /* Socket descriptor for client */
struct sockaddr_in echoServAddr; /* Local address */
struct sockaddr_in echoClntAddr; /* Client address */
unsigned short echoServPort; /* Server port */
unsigned int clntLen; /* Length of client address data structure */
char echoBuffer[RCVBUFSIZE]; /* Buffer for receiving client's msg string */
int recvMsgSize; /* Size of received message */
char *echoString; /* Server's reply to client */
unsigned int echoStringLen; /* Length of server's reply string */
echoString = "server is alive, how are you?"; /* Server's reply to client */
echoStringLen = 29;
echoServPort = 23; /* local port on which server is going to listen */
/* Create local TCP/IP socket for incoming connections */
servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
/* Construct local address structure */
memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */
echoServAddr.sin_family = AF_INET; /* Internet address family */
echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */
echoServAddr.sin_port = htons(echoServPort); /* Local port */
/* Bind local socket to the desired server port address */
int flag = bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr));
if (flag == -1) {
printf("error");
return 0;
}
/* Mark the socket so it will listen for incoming connections */
listen(servSock, MAXPENDING);
for (;;) /* Run forever */
{
/* Set the size of the in-out parameter */
clntLen = sizeof(echoClntAddr);
/* Blocking wait for a client to connect */
clntSock = accept(servSock