socket通讯

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
  |       |

close      close


三、UDP
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);
}



























































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值