今天主要講了TCP的收發(fā)
TCP發(fā)端步驟
①socket
②connect
③send
④close
TCP收端步驟
①socket
②bind
③listen
④accept
⑤recv
⑥clise
其函數(shù)主要有
connect
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:
發(fā)送鏈接請(qǐng)求
參數(shù):
sockfd:套接字文件描述符
addr:目的地址存放空間首地址
addrlen:IP地址的大小
返回值:
成功返回0
失敗返回-1
send
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:
發(fā)送數(shù)據(jù)
參數(shù):
sockfd:文件描述符
buf:發(fā)送數(shù)據(jù)空間首地址
len:發(fā)送數(shù)據(jù)的長(zhǎng)度
flags:屬性默認(rèn)為0
返回值:
成功返回實(shí)際發(fā)送字節(jié)數(shù)
失敗返回-1
recv
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:
接收數(shù)據(jù)
參數(shù):
sockfd:套接字文件描述符
buf:存放數(shù)據(jù)空間首地址
len:最大接收數(shù)據(jù)的長(zhǎng)度
flags:屬性默認(rèn)為0
返回值:
成功返回實(shí)際接收字節(jié)數(shù)
失敗返回-1
如果對(duì)方退出,返回0
listen
int listen(int sockfd, int backlog);
功能:
監(jiān)聽(tīng)客戶端發(fā)送的連接請(qǐng)求
該函數(shù)不會(huì)阻塞
參數(shù):
sockfd:套接字文件描述符
backlog:允許等待的尚未被處理的三次握手請(qǐng)求的最大個(gè)數(shù)
返回值:
成功返回0
失敗返回-1
accept
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:
處理等待連接隊(duì)列中的第一個(gè)連接請(qǐng)求
該函數(shù)具有阻塞功能(如果沒(méi)有人發(fā)送鏈接請(qǐng)求,會(huì)阻塞等待)
參數(shù):
socket:套接字文件描述符
address:存放IP地址的空間首地址
addrlen:存放IP地址大小空間首地址
返回值:
成功返回一個(gè)新的文件描述符
失敗返回-1
eg:利用TCP實(shí)現(xiàn)跨主機(jī)的文件發(fā)送文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-838489.html
send端
#include"head.h"
int main(void)
{
int sockfd = 0;
FILE *fp = 0;
int ret = 0;
ssize_t nsize = 0;
ssize_t nret = 0;
char tmpbuff[4096] = {0};
struct sockaddr_in srcaddr;
char filename[256] = {"a.txt"};
gets(filename);
srcaddr.sin_family = AF_INET;
srcaddr.sin_port = htons(50000);
srcaddr.sin_addr.s_addr = inet_addr("192.168.1.152");
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(-1 == sockfd)
{
perror("fail to socket");
return -1;
}
ret = connect(sockfd,(struct sockaddr *)&srcaddr,sizeof(srcaddr));
if(-1 == ret)
{
perror("fail to connect");
return -1;
}
nsize = send(sockfd,filename,strlen(filename),0);
if(-1 == nsize)
{
perror("fail to send");
return -1;
}
fp = fopen(filename, "rb");
if (fp == NULL)
{
perror("fail to fopen");
return -1;
}
while(1)
{
memset(tmpbuff,0,sizeof(tmpbuff));
sleep(1);
nsize = fread(tmpbuff, sizeof(char), 4096, fp);
if(0 >= nsize)
{
break;
}
send(sockfd, tmpbuff,nsize, 0);
}
close(sockfd);
fclose(fp);
return 0;
}
recv端
#include"head.h"
int main(void)
{
FILE *file = NULL;
ssize_t nsize = 0;
ssize_t nret = 0;
char name[20] = {0};
char tmpbuff[4096] = {0};
int sockfd = 0;
int recfd = 0;
int ret = 0;
struct sockaddr_in recaddr;
recaddr.sin_family = AF_INET;
recaddr.sin_port = htons(50000);
recaddr.sin_addr.s_addr = INADDR_ANY;
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(-1 == sockfd)
{
perror("fail to socket");
return -1;
}
ret = bind(sockfd,(struct sockaddr *)&recaddr,sizeof(recaddr));
if(-1 == ret)
{
perror("fail to bind");
return -1;
}
ret = listen(sockfd,10);
if(-1 == ret)
{
perror("fail to listen");
return -1;
}
recfd = accept(sockfd,NULL,NULL);
if(-1 == recfd)
{
perror("fail to accept");
return -1;
}
nret = recv(recfd,name,sizeof(name),0);
if(-1 == nret)
{
perror("fail to recv");
return -1;
}
file = fopen(name,"wb");
while ((nsize = recv(recfd, tmpbuff, sizeof(tmpbuff), 0)) > 0)
{
if (fwrite(tmpbuff, sizeof(char), nsize, file) < nsize)
{
perror("fail to write file");
fclose(file);
close(recfd);
close(sockfd);
return -1;
}
}
close(recfd);
fclose(file);
close(sockfd);
return 0;
}
結(jié)果:
以上就是今天內(nèi)容!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-838489.html
到了這里,關(guān)于TCP收發(fā)——計(jì)算機(jī)網(wǎng)絡(luò)——day02的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!