TCP通信:
? ? 1. TCP發(fā)端:
? ? ? ? socket? ->? connect? ->? send? ->? recv? ->? close
? ? 2. TCP收端:
? ? ? ? socket? ->? bind? ->? listen? ->? accept? -> recv? ->? send? ->? close
? ? 3. TCP需要用到的函數(shù):
????????1. connect:
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
? ? ? ? ? ? ? 功能:發(fā)送鏈接請(qǐng)求
? ? ? ? ? ? ? 參數(shù):
? ? ? ? ? ? ? ? ? sockfd:套接字文件描述符
? ? ? ? ? ? ? ? ? addr:目的地址存放空間首地址
? ? ? ? ? ? ? ? ? addrlen:IP地址的大小
? ? ? ? ? ? ? 返回值:
? ? ? ? ? ? ? ? ? ?成功返回0
? ? ???????????????失敗返回-1
? ? ? ? 2. send:
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
? ? ? ? ? ? ? 功能:發(fā)送數(shù)據(jù)
? ? ? ? ? ? ? 參數(shù):
? ? ? ? ? ? ? ? ? sockfd:文件描述符
? ? ? ? ? ? ? ? ? buf:發(fā)送數(shù)據(jù)空間首地址
? ? ? ? ? ? ? ? ? flags:屬性默認(rèn)為0
? ? ? ? ? ? ? 返回值:
? ? ? ? ? ? ? ? ? 成功返回實(shí)際發(fā)送字節(jié)數(shù)
? ? ? ? ? ? ? ? ? 失敗返回-1
? ? ? ? 3. 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?
? ? ? ? 4. 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?
? ? ? ? 5. 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
? ? ? ? 4. TCP編程練習(xí):
? ? ? ? ? ? ? ? 1. 利用TCP實(shí)現(xiàn)跨主機(jī)的文件發(fā)送:
send.c
#include "head.h"
int main(void)
{
FILE *fd = NULL;
int sockfd = 0;
int ret = 0;
struct sockaddr_in severaddr;
ssize_t nsize = 0;
size_t rret = 0;
char filename[100] = {0};
char tmpbuff[1024] = {0};
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd == -1)
{
perror("fail to socket");
return -1;
}
severaddr.sin_family = AF_INET;
severaddr.sin_port = htons(50000);
severaddr.sin_addr.s_addr = inet_addr("192.168.1.162");
ret = connect(sockfd,(struct sockaddr *)&severaddr, sizeof(severaddr));
if(ret == -1)
{
perror("fail to connect");
return -1;
}
scanf("%s", filename);
fd = fopen(filename, "r");
if(fd == NULL)
{
perror("fail to fopen");
return -1;
}
nsize = send(sockfd, filename, strlen(filename), 0);
if(nsize == -1)
{
perror("fail to send");
return -1;
}
while(1)
{
memset(tmpbuff, 0, sizeof(tmpbuff));
rret = fread(tmpbuff, 1, sizeof(tmpbuff), fd);
if(rret == 0)
{
break;
}
usleep(1000);
nsize = send(sockfd, tmpbuff, rret, 0);
if(nsize == -1)
{
perror("fail to send");
return -1;
}
}
fclose(fd);
close(sockfd);
return 0;
}
? ? ? ? 在這里,nsize = send(sockfd, tmpbuff, rret, 0);中,必須使用rret作為發(fā)送的字節(jié)大小,不能用sizeof(tmpbuff),因?yàn)槿绻嵌M(jìn)制文件,不是ASCII碼文件,\0可能成為發(fā)送的內(nèi)容,所以在這里rret作為讀到的字節(jié)數(shù),可以直接作為send的輸入。
recv.c文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-837457.html
#include "head.h"
int main(void)
{
FILE *fd = NULL;
int ret = 0;
int sockfd = 0;
int contfd = 0;
ssize_t nsize = 0;
char *ptmp = NULL;
char tmpbuff[1024] = {0};
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(50000);
serveraddr.sin_addr.s_addr = INADDR_ANY;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd == -1)
{
perror("fail to socket");
return -1;
}
ret = bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
if(ret == -1)
{
perror("fail to ret");
return -1;
}
ret = listen(sockfd, 10);
if(ret == -1)
{
perror("fail to listen");
return -1;
}
contfd = accept(sockfd, NULL, NULL);
if(contfd == -1)
{
perror("fail to accept");
return -1;
}
nsize = recv(contfd, tmpbuff, sizeof(tmpbuff), 0);
if(nsize == -1)
{
perror("fail to recv");
return -1;
}
fd = fopen(tmpbuff, "w");
if(fd == NULL)
{
perror("fail to fopen");
return -1;
}
while(1)
{
memset(tmpbuff, 0, sizeof(tmpbuff));
nsize = recv(contfd, tmpbuff, sizeof(tmpbuff), 0);
if(nsize <= 0)
{
break;
}
fwrite(tmpbuff, 1, nsize, fd);
}
fclose(fd);
close(contfd);
close(sockfd);
return 0;
}
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-837457.html
到了這里,關(guān)于嵌入式學(xué)習(xí)第二十六天?。ňW(wǎng)絡(luò)傳輸:TCP編程)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!