国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

嵌入式學(xué)習(xí)第二十六天?。ňW(wǎng)絡(luò)傳輸:TCP編程)

這篇具有很好參考價(jià)值的文章主要介紹了嵌入式學(xué)習(xí)第二十六天?。ňW(wǎng)絡(luò)傳輸:TCP編程)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

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

#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;
}

嵌入式學(xué)習(xí)第二十六天?。ňW(wǎng)絡(luò)傳輸:TCP編程),網(wǎng)絡(luò),學(xué)習(xí),tcp/ip文章來(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)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包