『壹』 C 語言socket 的send數據太大,最大能發送多少如何分批發送
如果你SOCKET發的數據報,比如UDP協議, 那麼是有最大可發送大小.
這可以用下面這樣getsockopt取得最大數據報大小.
----------------------------------------
SOCKET s;
int iSize, iVal, ret;
.....
iSize = sizeof(iVal);
ret = getsockopt(s, SOL_SOCKET, SO_MAX_MSG_SIZE, (char *)&iVal, &iSize);
//-----------------------------------------
如果是TCP,則不需要這樣做.
你send返回的位元組數有801770個位元組(是位元組數吧!),和send里的規定length一樣大,這可以表明你成功的將這些數據提交底層TCP協議棧去發送。
接收方要是處理成確的,是可以正確無誤的收到這些數據的。
//---------------------------------------------
TCP 提供的是可靠的數據流服務 , 這意味著, 接收方,並不需要關心也不應該假定發送方調用了多少次SEND, 它只需要管的是通過若干次RECV把數據從協議棧的緩沖區讀取出來。
TCP不必擔心丟數據,但發送的時候,SEND要注意處理返回值,如果是阻塞方式,太多的數據會被阻塞, 如果是非阻方式,返回緩沖區滿錯,然後延時重發。
『貳』 能否給我一個用純C編寫的UDP發送和接收的程序
UDP的,你看下
1.伺服器端實現
程序在收到客戶端發送來的消息後,給客戶端發送消息,提示客戶端收到了該消息
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int sock, length, fromlen, n;
struct sockaddr_in server;
struct sockaddr_in from;
char buf[1024];
//要求執行是輸入埠信息
if (argc!= 2) {
printf( "Usage: %s port_num\n",argv[0]);
return 1;
}
//創建通信所需的套接字,並與地址和埠信息幫定
sock=socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0){
perror("cannot create communicating socket");
return 1;
}
length = sizeof(server);
bzero(&server,length);
server.sin_family=AF_INET;
server.sin_addr.s_addr=INADDR_ANY;
server.sin_port=htons(atoi(argv[1]));
if (bind(sock,(struct sockaddr *)&server,length)<0){
perror("cannot bind the socket");
close(sock);
return 1;
}
fromlen = sizeof(struct sockaddr_in);
//讀取客戶端發送來的信息,顯示後,發回相關信息給客戶端
while (1) {
n = recvfrom(sock,buf,sizeof(buf),0,(struct sockaddr *)&from,&fromlen);
if (n < 0) {
perror("cannot receive date from client");
break;
}
write(STDOUT_FILENO,"server: Received a datagram: ",29);
write(STDOUT_FILENO,buf,n);
n = sendto(sock,"send message to client\n",22,
0,(struct sockaddr *)&from,fromlen);
if (n < 0) {
perror("cannot send data to the client");
break;
}
}
close(sock);
return 0;
}
2.客戶端實現
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int sock, length, n;
struct sockaddr_in server, from;
struct hostent *hp;
char buffer[256];
//判斷輸入參數是否符合要求
if (argc != 3) {
printf("Usage: %s server_ip port_num\n",argv[0]);
return 1;
}
//創建通信套接字
sock= socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
perror("cannot create communicating socket");
return 1;
}
server.sin_family = AF_INET;
hp = gethostbyname(argv[1]);
if (hp==0) {
perror("cannot get the server ip address");
return 1;
}
b((char *)hp->h_addr,
(char *)&server.sin_addr,
hp->h_length);
server.sin_port = htons(atoi(argv[2]));
length=sizeof(struct sockaddr_in);
printf("(client) enter the message: ");
bzero(buffer,256);
fgets(buffer,255,stdin);
//發送數據給指定伺服器
n=sendto(sock,buffer,strlen(buffer),0,&server,length);
if (n < 0){
perror("cannot get message from the client");
return 1;
}
//從伺服器中接受數據
bzero(buffer,256);
n = recvfrom(sock,buffer,256,0,&from, &length);
if (n < 0) {
perror("cannot send message to the server");
return 1;
}
printf("client got message : %s\n",buffer);
close(sock);
return 0;
}
『叄』 TCP與UDP應用的例子有哪些
1、TCP應用
(1)FTP:文件傳輸協議;
(2)SSH:安全登錄、文件傳送(SCP)和埠重定向;
(3)Telnet:不安全的文本傳送;
(4)SMTP:簡單郵件傳輸協議Simple Mail Transfer Protocol (E-mail);
(5)HTTP:超文本傳送協議 (WWW);
2、UDP應用
(1)流媒體
採用TCP,一旦發生丟包,TCP會將後續包緩存起來,等前面的包重傳並接收到後再繼續發送,延遲會越來越大。基於UDP的協議如WebRTC是極佳的選擇。
(2)實時游戲
對實時要求較為嚴格的情況下,採用自定義的可靠UDP協議,比如Enet、RakNet(用戶有sony online game、minecraft)等,自定義重傳策略,能夠把丟包產生的延遲降到最低,盡量減少網路問題對游戲性造成的影響。
採用UDP的經典游戲如FPS游戲Quake、CS,著名的游戲引擎Unity3D採用的也是RakNet。
(3)物聯網
2014年google旗下的Nest建立Thread Group,推出了物聯網通信協議Thread,完善物聯網通信。
全球將近50%的人都在使用互聯網,人們不斷的追求更快、更好的服務,一切都在變化,在越來越多的領域,UDP將會搶佔TCP的主導地位。
(4)QQ 文件傳輸、QQ語音、QQ視頻
對於網路通訊質量要求不高的情況下,要求網路通訊速度能盡量快捷方便,就可以使用UDP技術。