Socket通讯
一、函数
socket:创建一个socket
bind:绑定IP地址和端口号到docket
connect:与服务器建立连接
listen:设置服务器能处理的最大连接要求
accept:等待来自客户端的socket连接请求
send:发送数据
recv:接收数据
二、TCP
1.基于TCP服务器
1.创建一个socket,函数socket()
2.绑定IP地址端口等信息到socket上,函数bind()
3.设置允许的最大连接数,函数listen()
4.等待来自客户端的连接请求,函数accept()
5.收发数据,用send和recv或者read和write
6.关闭网络连接
2.基于TCP客户端
1.创建一个socket,函数socket
2.设置要连接的服务器的IP地址和端口属性
3.连接服务器,函数connect
4.收发数据,用send、recv或read、write函数
5.关闭网络连接
3.基于TCP的通讯模型
服务器
socket
|
bind
|
listen 客户机
| |
accept socket
| |
阻塞等待用户数 <--- 建立连接 --- connect
| |
read <--- 请求数据 --- write
| |
处理服务 |
| |
write --- 应答数据 ---> read
| |
1.基于UDP服务器
1.创建一个socket,函数socket
2.绑定IP地址,端口等信息到docket,函数bind
3.循环接收数据,函数recvfrom
4.关闭网络连接
2.基于UDP客户端
1.创建一个socket,函数socket
2.绑定IP地址,端口等信息到socket上,函数bind
3.设置对方的IP地址和端口等属性
4.发送数据,函数sendto
5.关闭网络连接
3.基于UDP通讯模型
服务器
socket
| 客户机
bind socket
| |
readfrom bind
| |
阻塞等待客户数 <--- 请求服务 --- sendto
| |
处理服务请求 |
| |
sendto --- 应答服务 ---> readfrom
| |
close close
四、循环、并发服务器
循环服务器:服务器同一时刻只能响应一个客户端
并发服务器:服务器同一时刻能响应多个客户端
TCP服务器如果有一个客户端占住不放,其他的客户机都不能工作,所以TCP一般很少使用循环服务器
TCP并发服务器
socket
bind
listen
while(1){
accept
if(fork() == 0){
process()
close
exit
}
}
五、例子
1.TCP服务器
//TCP Service
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include<sys/wait.h>
#include <tcl.h>
#include <unistd.h>
#include <arpa/inet.h>
int main(int argc, char **argv)
{
if(argc != 2)
{
//printf("Usage: UDPClient ...\n");
//exit(1);
}
struct sockaddr_in client;
struct sockaddr_in sock;
sock.sin_family = AF_INET;
sock.sin_port = 3490;
//自动填本机ip
sock.sin_addr.s_addr = INADDR_ANY;
bzero(&(sock.sin_zero), 8);
int sockid = socket(AF_INET, SOCK_STREAM, 0);
if(sockid == -1)
{
printf("socket error! line = %d\n", __LINE__);
return -1;
}
int nBind = bind(sockid, (struct sockaddr *)&sock, sizeof(sock));
if (nBind == -1)
{
printf("bind error! line = %d\n", __LINE__);
return -1;
}
int nListenRe = listen(sockid, 10);//listen的请求接收队列长度
if (nListenRe == -1)
{
printf("listen error! line = %d\n", __LINE__);
return -1;
}
char cRecvChar[64] = "\0";
ssize_t nRecvSize;
while(1)
{
int size = sizeof(struct sockaddr_in);
int nAccept = accept(sockid, (struct sockaddr*)&client, &size);
if (nAccept == -1)
{
printf("accept error! line = %d\n", __LINE__);
continue;
}
else
{
//printf("get connection from %s\n", inet_ntoa(client.sin_addr));
while(1)
{
nRecvSize = recv(nAccept, (void *)cRecvChar, 64, 0);
if (nRecvSize <= 0)
{
printf("recv Error!\n");
}
else
{
printf("get connection from %s\n", inet_ntoa(client.sin_addr));
printf("recv byte = %s\n", cRecvChar);
}
sleep(1);
}
}
sleep(1);
close(nAccept);
}
close(sockid);
}
2.TCP客户端
//TCP Client
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include<sys/wait.h>
#include <tcl.h>
#include <unistd.h>
#include <arpa/inet.h>
int main(int argc, char **argv)
{
if(argc != 2)
{
printf("Usage: UDPClient ...\n");
return -1;
}
struct sockaddr_in sock;
sock.sin_family = AF_INET;
sock.sin_port = 3490;
sock.sin_addr.s_addr = inet_addr("127.0.0.1");
struct sockaddr_in client_sock;
client_sock.sin_family = AF_INET;
client_sock.sin_addr.s_addr = htonl(INADDR_ANY);
client_sock.sin_port = 0;
//memset(sock.size_zero, 0, sizeof(sock.size_zero));
int sockid = socket(AF_INET, SOCK_STREAM, 0);
if(sockid == -1)
{
printf("socket error! line = %d\n", __LINE__);
return -1;
}
int nBindID = bind(sockid, (struct sockaddr*)&client_sock, sizeof(struct sockaddr_in));
if(nBindID == -1)
{
printf("bind error! line = %d\n", __LINE__);
return -1;
}
int nConID = connect(sockid, (struct sockaddr *)&sock, sizeof(sock));
if (nConID == -1)
{
printf("connect error! line = %d\n", __LINE__);
return -1;
}
char cSendChar[64] = "hello";
ssize_t nSendSize;
while(1)
{
nSendSize = send(sockid, (void *)cSendChar, strlen(cSendChar), 0);
if (nSendSize)
{
printf("send %d byte ok!\n", nSendSize);
}
else
{
printf("send Error!\n");
}
//char msg[64];
//recv(sockid, msg, 64, 0);
//printf("client recv msg = %s\n", msg);
sleep(2);
}
close(sockid);
}
3.UDP服务器
//UDP Service
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include<sys/wait.h>
#include <tcl.h>
#include <unistd.h>
#include <arpa/inet.h>
int main(int argc, char **argv)
{
if(argc != 2)
{
//printf("Usage: UDPClient ...\n");
//exit(1);
}
struct sockaddr_in client;
struct sockaddr_in sock;
sock.sin_family = AF_INET;
sock.sin_port = 3490;
sock.sin_addr.s_addr = INADDR_ANY;
//memset(sock.size_zero, 0, sizeof(sock.size_zero));
int sockid = socket(AF_INET, SOCK_DGRAM, 0);
if(sockid == -1)
{
printf("socket error! line = %d\n", __LINE__);
return -1;
}
int nBind = bind(sockid, (struct sockaddr *)&sock, sizeof(sock));
if (nBind == -1)
{
printf("bind error! line = %d\n", __LINE__);
return -1;
}
char cRecvChar[64] = "\0";
ssize_t nRecvSize;
int size;
while(1)
{
nRecvSize = recvfrom(sockid, (void *)cRecvChar, 64, 0, (struct sockaddr *)&client, &size);
if (nRecvSize == 0)
{
printf("recv Error!\n");
}
else
{
printf("recv %d byte ok!\n", nRecvSize);
printf("recv byte = %s\n", cRecvChar);
}
sleep(2);
}
close(sockid);
}
4.UDP客户端
//UDP Client
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include<sys/wait.h>
#include <tcl.h>
#include <unistd.h>
#include <arpa/inet.h>
int main(int argc, char **argv)
{
if(argc != 2)
{
printf("Usage: UDPClient ...\n");
return -1;
}
struct sockaddr_in sock;
sock.sin_family = AF_INET;
sock.sin_port = 3490;
sock.sin_addr.s_addr = inet_addr("127.0.0.1");
//memset(sock.size_zero, 0, sizeof(sock.size_zero));
int sockid = socket(AF_INET, SOCK_DGRAM, 0);
if(sockid == -1)
{
printf("socket error! line = %d\n", __LINE__);
return -1;
}
int nBindID = bind(sockid, (struct sockaddr*)&sock, sizeof(struct sockaddr_in));
if(nBindID == -1)
{
printf("bind error! line = %d\n", __LINE__);
return -1;
}
char cSendChar[64] = "hello";
ssize_t nSendSize;
while(1)
{
nSendSize = sendto(sockid, (void *)cSendChar, 64, 0, (struct sockaddr *)&sock, sizeof(sock));
if (nSendSize)
{
printf("send %d byte ok!\n", nSendSize);
}
else
{
printf("send Error!\n");
}
sleep(2);
}
close(sockid);
}
一、函数
socket:创建一个socket
bind:绑定IP地址和端口号到docket
connect:与服务器建立连接
listen:设置服务器能处理的最大连接要求
accept:等待来自客户端的socket连接请求
send:发送数据
recv:接收数据
二、TCP
1.基于TCP服务器
1.创建一个socket,函数socket()
2.绑定IP地址端口等信息到socket上,函数bind()
3.设置允许的最大连接数,函数listen()
4.等待来自客户端的连接请求,函数accept()
5.收发数据,用send和recv或者read和write
6.关闭网络连接
2.基于TCP客户端
1.创建一个socket,函数socket
2.设置要连接的服务器的IP地址和端口属性
3.连接服务器,函数connect
4.收发数据,用send、recv或read、write函数
5.关闭网络连接
3.基于TCP的通讯模型
服务器
socket
|
bind
|
listen 客户机
| |
accept socket
| |
阻塞等待用户数 <--- 建立连接 --- connect
| |
read <--- 请求数据 --- write
| |
处理服务 |
| |
write --- 应答数据 ---> read
| |
close close
1.基于UDP服务器
1.创建一个socket,函数socket
2.绑定IP地址,端口等信息到docket,函数bind
3.循环接收数据,函数recvfrom
4.关闭网络连接
2.基于UDP客户端
1.创建一个socket,函数socket
2.绑定IP地址,端口等信息到socket上,函数bind
3.设置对方的IP地址和端口等属性
4.发送数据,函数sendto
5.关闭网络连接
3.基于UDP通讯模型
服务器
socket
| 客户机
bind socket
| |
readfrom bind
| |
阻塞等待客户数 <--- 请求服务 --- sendto
| |
处理服务请求 |
| |
sendto --- 应答服务 ---> readfrom
| |
close close
四、循环、并发服务器
循环服务器:服务器同一时刻只能响应一个客户端
并发服务器:服务器同一时刻能响应多个客户端
TCP服务器如果有一个客户端占住不放,其他的客户机都不能工作,所以TCP一般很少使用循环服务器
TCP并发服务器
socket
bind
listen
while(1){
accept
if(fork() == 0){
process()
close
exit
}
}
五、例子
1.TCP服务器
//TCP Service
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include<sys/wait.h>
#include <tcl.h>
#include <unistd.h>
#include <arpa/inet.h>
int main(int argc, char **argv)
{
if(argc != 2)
{
//printf("Usage: UDPClient ...\n");
//exit(1);
}
struct sockaddr_in client;
struct sockaddr_in sock;
sock.sin_family = AF_INET;
sock.sin_port = 3490;
//自动填本机ip
sock.sin_addr.s_addr = INADDR_ANY;
bzero(&(sock.sin_zero), 8);
int sockid = socket(AF_INET, SOCK_STREAM, 0);
if(sockid == -1)
{
printf("socket error! line = %d\n", __LINE__);
return -1;
}
int nBind = bind(sockid, (struct sockaddr *)&sock, sizeof(sock));
if (nBind == -1)
{
printf("bind error! line = %d\n", __LINE__);
return -1;
}
int nListenRe = listen(sockid, 10);//listen的请求接收队列长度
if (nListenRe == -1)
{
printf("listen error! line = %d\n", __LINE__);
return -1;
}
char cRecvChar[64] = "\0";
ssize_t nRecvSize;
while(1)
{
int size = sizeof(struct sockaddr_in);
int nAccept = accept(sockid, (struct sockaddr*)&client, &size);
if (nAccept == -1)
{
printf("accept error! line = %d\n", __LINE__);
continue;
}
else
{
//printf("get connection from %s\n", inet_ntoa(client.sin_addr));
while(1)
{
nRecvSize = recv(nAccept, (void *)cRecvChar, 64, 0);
if (nRecvSize <= 0)
{
printf("recv Error!\n");
}
else
{
printf("get connection from %s\n", inet_ntoa(client.sin_addr));
printf("recv byte = %s\n", cRecvChar);
}
sleep(1);
}
}
sleep(1);
close(nAccept);
}
close(sockid);
}
2.TCP客户端
//TCP Client
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include<sys/wait.h>
#include <tcl.h>
#include <unistd.h>
#include <arpa/inet.h>
int main(int argc, char **argv)
{
if(argc != 2)
{
printf("Usage: UDPClient ...\n");
return -1;
}
struct sockaddr_in sock;
sock.sin_family = AF_INET;
sock.sin_port = 3490;
sock.sin_addr.s_addr = inet_addr("127.0.0.1");
struct sockaddr_in client_sock;
client_sock.sin_family = AF_INET;
client_sock.sin_addr.s_addr = htonl(INADDR_ANY);
client_sock.sin_port = 0;
//memset(sock.size_zero, 0, sizeof(sock.size_zero));
int sockid = socket(AF_INET, SOCK_STREAM, 0);
if(sockid == -1)
{
printf("socket error! line = %d\n", __LINE__);
return -1;
}
int nBindID = bind(sockid, (struct sockaddr*)&client_sock, sizeof(struct sockaddr_in));
if(nBindID == -1)
{
printf("bind error! line = %d\n", __LINE__);
return -1;
}
int nConID = connect(sockid, (struct sockaddr *)&sock, sizeof(sock));
if (nConID == -1)
{
printf("connect error! line = %d\n", __LINE__);
return -1;
}
char cSendChar[64] = "hello";
ssize_t nSendSize;
while(1)
{
nSendSize = send(sockid, (void *)cSendChar, strlen(cSendChar), 0);
if (nSendSize)
{
printf("send %d byte ok!\n", nSendSize);
}
else
{
printf("send Error!\n");
}
//char msg[64];
//recv(sockid, msg, 64, 0);
//printf("client recv msg = %s\n", msg);
sleep(2);
}
close(sockid);
}
3.UDP服务器
//UDP Service
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include<sys/wait.h>
#include <tcl.h>
#include <unistd.h>
#include <arpa/inet.h>
int main(int argc, char **argv)
{
if(argc != 2)
{
//printf("Usage: UDPClient ...\n");
//exit(1);
}
struct sockaddr_in client;
struct sockaddr_in sock;
sock.sin_family = AF_INET;
sock.sin_port = 3490;
sock.sin_addr.s_addr = INADDR_ANY;
//memset(sock.size_zero, 0, sizeof(sock.size_zero));
int sockid = socket(AF_INET, SOCK_DGRAM, 0);
if(sockid == -1)
{
printf("socket error! line = %d\n", __LINE__);
return -1;
}
int nBind = bind(sockid, (struct sockaddr *)&sock, sizeof(sock));
if (nBind == -1)
{
printf("bind error! line = %d\n", __LINE__);
return -1;
}
char cRecvChar[64] = "\0";
ssize_t nRecvSize;
int size;
while(1)
{
nRecvSize = recvfrom(sockid, (void *)cRecvChar, 64, 0, (struct sockaddr *)&client, &size);
if (nRecvSize == 0)
{
printf("recv Error!\n");
}
else
{
printf("recv %d byte ok!\n", nRecvSize);
printf("recv byte = %s\n", cRecvChar);
}
sleep(2);
}
close(sockid);
}
4.UDP客户端
//UDP Client
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include<sys/wait.h>
#include <tcl.h>
#include <unistd.h>
#include <arpa/inet.h>
int main(int argc, char **argv)
{
if(argc != 2)
{
printf("Usage: UDPClient ...\n");
return -1;
}
struct sockaddr_in sock;
sock.sin_family = AF_INET;
sock.sin_port = 3490;
sock.sin_addr.s_addr = inet_addr("127.0.0.1");
//memset(sock.size_zero, 0, sizeof(sock.size_zero));
int sockid = socket(AF_INET, SOCK_DGRAM, 0);
if(sockid == -1)
{
printf("socket error! line = %d\n", __LINE__);
return -1;
}
int nBindID = bind(sockid, (struct sockaddr*)&sock, sizeof(struct sockaddr_in));
if(nBindID == -1)
{
printf("bind error! line = %d\n", __LINE__);
return -1;
}
char cSendChar[64] = "hello";
ssize_t nSendSize;
while(1)
{
nSendSize = sendto(sockid, (void *)cSendChar, 64, 0, (struct sockaddr *)&sock, sizeof(sock));
if (nSendSize)
{
printf("send %d byte ok!\n", nSendSize);
}
else
{
printf("send Error!\n");
}
sleep(2);
}
close(sockid);
}