標籤:
相關函數:send, sendmsg, recv, recvfrom, socket
標頭檔:#include <sys/types.h> #include <sys/socket.h>
定義函數:int sendto(int s, const void * msg, int len, unsigned int flags, const struct sockaddr * to, int tolen);
函數說明:sendto() 用來將資料由指定的socket 傳給對方主機. 參數s 為已建好連線的socket, 如果利用UDP協議則不需經過連線操作. 參數msg 指向欲連線的資料內容, 參數flags 一般設0, 詳細描述請參考send(). 參數to 用來指定欲傳送的網路地址, 結構sockaddr 請參考bind(). 參數tolen 為sockaddr 的結果長度.
傳回值:成功則返回實際傳送出去的字元數, 失敗返回-1, 錯誤原因存於errno 中.
錯誤碼:
1、EBADF 參數s 非法的socket 處理代碼.
2、EFAULT 參數中有一指標指向無法存取的記憶體空間.
3、WNOTSOCK canshu s 為一檔案描述詞, 非socket.
4、EINTR 被訊號所中斷.
5、EAGAIN 此動作會令進程阻斷, 但參數s 的soket 為補課阻斷的.
6、ENOBUFS 系統的緩衝記憶體不足.
7、EINVAL 傳給系統調用的參數不正確.
範例
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet.in.h>
#include <arpa.inet.h>
#define PORT 2345 /*使用的port */
main()
{
int sockfd, len;
struct sockaddr_in addr;
char buffer[256];
//建立socket
if(sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror ("socket");
exit(1);
}
//填寫sockaddr_in 結構
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr = hton1(INADDR_ANY);
if(bind(sockfd, &addr, sizeof(addr)) < 0)
{
perror("connect");
exit(1);
}
while(1)
{
bezro(buffer, sizeof(buffer));
len = recvfrom(socket, buffer, sizeof(buffer), 0, &addr &addr_len);
//顯示client 端的網路地址
printf("receive from %s\n ", inet_ntoa(addr.sin_addr));
//將字串返回給client 端
sendto(sockfd, buffer, len, 0, &addr, addr_len);
}
}
執行:請參考recvfrom()
/*利用socket的UDPclient
此程式會連線UDPserver,並將鍵盤輸入的字串傳給server。
UDPserver範例請參考sendto()。
*/
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#definePORT2345
#defineSERVER_IP“127.0.0.1”
main()
{
ints,len;
structsockaddr_inaddr;
intaddr_len=
sizeof
(structsockaddr_in);
charbuffer[256];
/*建立socket*/
if
((s=socket(AF_INET,SOCK_DGRAM,0))<0){
perror
(“socket”);
exit
(1);
}
/*填寫sockaddr_in*/
bzero(&addr,
sizeof
(addr));
addr.sin_family=AF_INET;
addr.sin_port=htons(PORT);
addr.sin_addr.s_addr=inet_addr(SERVER_IP);
while
(1){
bzero(buffer,
sizeof
(buffer));
/*從標準輸入裝置取得字串*/
len=read(STDIN_FILENO,buffer,
sizeof
(buffer));
/*將字串傳送給server端*/
sendto(s,buffer,len,0,(structsockaddr*)&addr,addr_len);
/*接收server端返回的字串*/
len=recvfrom(s,buffer,
sizeof
(buffer),0,(structsockaddr*)&addr,(socklen_t*)
&addr_len);
printf
(“receive:%s”,buffer);
}
}
執行(先執行udpserver再執行udpclient)
hello
/*從鍵盤輸入字串*/
receive:hello
/*server端返回來的字串*/
C語言sendto()函數-經socket傳送資料以及recvfrom函數《轉》