C語言sendto()函數-經socket傳送資料以及recvfrom函數《轉》

來源:互聯網
上載者:User

標籤:

相關函數: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函數《轉》

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.