1.TCP客户/服务器模型
TCP服务器:socket()–>bind()–>listen()–>accept()–>block直至客户连接到达---->read()–>处理请求–>write()---->read()–>close()
TCP客户端:socket()—>connect()---->write()----->read()---->close()
2.回射客户/服务器
返回客户发送的信息;
3.socket函数
包含头文件<sys/socket.h>
功能:创建一个套接字用于通信;
原型:int socket(int domain, int type, int protocol);
参数:domain:指定通信协议族(protocol family);
type:指定socket类型,流式套接字SOCK_STREAM,数据报套接字SOCK_DGRAM,原始套接字SOCK_RAW;
protocol:协议类型;
返回值:成功返回非负整数,它与文件描述符类似,我们把它称为套接口描述子,简称套接字。失败返回-1;
4.bind函数
包含头文件<sys/socket.h>
功能:绑定一个本地地址到套接字;
原型:int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数:sockfd:socket函数返回的套接字;
addr:要绑定的地址;
addrlen:地址长度;
返回值:成功返回0,失败返回-1;
5.listen函数
包含头文件<sys/socket.h>
功能:将套接字用于监听进入的连接;
原型:int listen(int sockfd, int backlog);
参数:sockfd:socket函数返回的套接字;
backlog:规定内核为此套接字排队的最大连接个数;
返回值:成功返回0,失败返回-1;
6.accept函数
包含头文件<sys/socket.h>
功能:从已完成连接队列返回第一个连接,如果已完成连接队列为空,则阻塞;
原型:int accept(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数:sockfd:socket函数返回的套接字;
addr:要绑定的地址;
addrlen:地址长度;
返回值:成功返回非负整数,失败返回-1;
7.write函数
包含头文件<unistd.h>
8.read函数
包含头文件<unistd.h>
/*server side:begin
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
using namespace std;
#define ERR_EXIT(m) do{ perror(m); exit(EXIT_FAILURE);}while(0)
int main()
{
int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sockfd<0)
ERR_EXIT("socket");
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(5188);
//servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
//inet_aton("127.0.0.1", &servaddr.sin_addr);
if(bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)))
ERR_EXIT("bind");
int listenfd = listen(sockfd, SOMAXCONN);
if(listenfd<0)
ERR_EXIT("listen");
struct sockaddr_in peeraddr;
socklen_t peerlen = sizeof(peeraddr);
int conn = accept(sockfd, (struct sockaddr*)&peeraddr, &peerlen);
if(conn<0)
ERR_EXIT("accept");
char recvbuf[1024];
while(1)
{
memset(recvbuf, 0, sizeof(recvbuf));
int ret = read(conn, recvbuf, sizeof(recvbuf));
fputs(recvbuf, stdout);
write(conn, recvbuf, ret);
}
close(conn);
close(sockfd);
return 0;
}
server side:end*/
/*client side:begin
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
using namespace std;
#define ERR_EXIT(m) do{ perror(m); exit(EXIT_FAILURE);}while(0)
int main()
{
int sockfd;
if((sockfd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))<0)
ERR_EXIT("socket");
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(5188);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
//inet_aton("127.0.0.1", &servaddr.sin_addr);
if(connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr))<0)
ERR_EXIT("connect");
char sendbuf[1024] = {0};
char recvbuf[1024] = {0};
while(fgets(sendbuf, sizeof(sendbuf), stdin) != NULL)
{
write(sockfd, sendbuf, strlen(sendbuf));
read(sockfd, recvbuf, sizeof(recvbuf));
fputs(recvbuf, stdout);
memset(&sendbuf, 0, sizeof(sendbuf));
memset(&recvbuf, 0, sizeof(recvbuf));
}
close(sockfd);
return 0;
}
client side:end*/