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。