2015-01-17 13:40:24|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, 网络通信|来源:唯设编程网
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!
结果表明成功从本地连接到百度的服务器。
int send (int sockfd, const void *msg, int len , unsigned int flags);
返回:若成功则返回发送的字节数,失败则返回-1。
参数:sockfd为socket编号,msg指向待发送的数据,len表示数据长度,flags一般设为0。