C/C++编程之socket基本函数的用法

2015-01-17 13:40:24|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C/C++, 网络通信|来源:唯设编程网

5.请求连接函数

int connect (int sockfd, const struct sockaddr *ser_addr, socklen_t *addr_len);

sockfd表示已经建立的socket,serv_addr存储服务器的IP和端口信息,addr_len是sockadrr的长度,可以用sizeof函数获取。

本函数用于创建与指定外部端口的连接。s参数指定一个未连接的数据报或流类套接口。如套接口未被捆绑,则系统赋给本地关联一个唯一的值,且设置套接口为已捆绑。请注意若名字结构中的地址域为全零的话,则connect()将返回WSAEADDRNOTAVAIL错误。

对于流类套接口(SOCK_STREAM类型),利用名字来与一个远程主机建立连接,一旦套接口调用成功返回,它就能收发数据了。对于数据报类套接口(SOCK_DGRAM类型),则设置成一个缺省的目的地址,并用它来进行后续的send()与recv()调用。

下面是Windows环境该函数错误代码:

WSAENOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。
WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。
WSAEADDRINUSE:所指的地址已在使用中。
WSAEINTR:通过一个WSACancelBlockingCall()来取消一个(阻塞的)调用。
WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。
WSAEADDRNOTAVAIL:在本地机器上找不到所指的地址。
WSAENOTSUPPORT:所指族中地址无法与本套接口一起使用。
WSAECONNREFUSED:连接尝试被强制拒绝。
WSAEDESTADDREQ:需要目的地址。
WSAEFAULT:namelen参数不正确。
WSAEINVAL:套接口没有准备好与一地址捆绑。
WSAEISCONN:套接口早已连接。
WSAEMFILE:无多余文件描述字。
WSAENETUNREACH:当前无法从本主机访问网络。
WSAENOBUFS:无可用缓冲区。套接口未被连接。
WSAENOTSOCK:描述字不是一个套接口。
WSAETIMEOUT:超时时间到。
WSAEWOULDBLOCK:套接口设置为非阻塞方式且连接不能立即建立。可用select()调用对套接口写,因为select()时会进行连接。

程序remote_connect_baidu.c使用connect从本地客户端连接baidu的服务器,代码如下:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define PORT 80
#define BAIDU "119.75.217.56"

int main()
{
    int sockfd;
    struct sockaddr_in addr;
    if( (sockfd=socket(AF_INET,SOCK_STREAM,0)) < 0 )
    {
        perror("socket create error!");
        exit(1);
    }
    else
    {
        printf("socket create successfully!
");
        printf("socket id:%d
",sockfd);
    }

    bzero(&addr,sizeof(struct sockaddr_in));
    addr.sin_family=AF_INET;
    addr.sin_port=htons(PORT);
    addr.sin_addr.s_addr=inet_addr(BAIDU);
    if ( connect(sockfd, (struct sockaddr*)(&addr), sizeof(struct sockaddr)) < 0 )
    {
        perror("connect error!");
        exit(1);
    }
    else
    {
        printf("connected successfully!
");
    }
    return 0;
}

运行结果如下:

socket create successfully!
socket id:3
connected successfully!

结果表明成功从本地连接到百度的服务器。

6.数据发送函数

int send (int sockfd, const void *msg, int len , unsigned int flags);

返回:若成功则返回发送的字节数,失败则返回-1。
参数:sockfd为socket编号,msg指向待发送的数据,len表示数据长度,flags一般设为0。

发表评论0条 】
网友评论(共?条评论)..
C/C++编程之socket基本函数的用法