精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
要点:
sd=socket(domain,type,protocol);
指定参数为:通信域,socket类型,通信协议。
connect(sd,&serv_addr,addrlen);
指定要通信的地址
read(sd,buf,nbytes);
write(sd,buf,nbytes);
是使用UNIX的I/O方式还是用发送接收函数,随后再讨论。close(sd);
shutdown(sd,how);
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain,int type,int protocol);
在成功时,返回一个非负数的整数,这个数理解为socket描述符,这类描述符和文件描述符类似。
域名 |
值 |
含意 |
PF_UNSPEC |
0 |
未定义 |
PF_LOCAL |
1 |
对应于PF_UNIX的POSIX下名称 |
PF_UNIX,PF_FILE |
PF_LOCAL |
Unix域socket |
PF_INET |
2 |
IPV4 |
PF_AX25 |
3 |
|
|
|
|
SOCK_STREAM
SOCK_DGRAM
SOCK_RAW
SOCK_RDM
SOCK_SEQPACKET
SOCK_PACKET
EPROTONOSUPPOT:类型或协议不支持
EAFNOSUPPORT:指定的地址簇不支持
ENFILE:没有足够的内核内在来创建socket结构
EMFILE:进程文件表溢出
EACCES:权限否决
ENOBUFS,ENOMEM:没有足够的内在来创建socket
EINVAL:不可知的协议或协议簇
#include <errno.h> … sd=socket(PF_INET,SOCK_STREAM,0); if(sd<0) { perror(“Failed to create the socket”); exit(errno); }
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sd,const struct sockaddr*serv_addr,socklen_t addrlen);
struct sockaddr_un addr; … sd=socket(PF_LOCAL,SOCK_STREAM,0); … if(connect(sd,(struct sockaddr*)&addr,sizeof(addr))) { perror(“client connect”);exit(EXIT_FAILURE); } 每类协议有它自己的地址结构。
EBADF:无效的描述符值
int getsockname(int sd,const struct sockaddr*local_addr,socklen_t addrlen);
会得到和描述符对应连接的地址和端口的信息
#include <unistd.h>
int close(int sd);
#include <sys/socket.h>
int shudown(int sd,int how);
这个函数在成功时返回0,失败的错误情况如下:
EBADF:描述符无效。
SHUT_RD:不再接收数据。在当前接收缓冲里的数据会被丢弃。
SHUT_WR:不再发送数据。在当前发送缓冲里的数据会被丢弃。
SHUT_RDWR:发收都停止。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#define MSG_LEN 1024
int main(void) { struct sockaddr_un uaddr; int msg_len,sd; char message[MSG_LEN]; uaddr.sun_family=AF_UNIX; strcpy(uaddr.sun_path,”/tmp/mysock”); sd=socket(PF_UNIX,SOCK_STREAM,0); connect(sd,(struct sockaddr*)&uaddr,sizeof(uaddr)); msg_len=strlen(fgets(message,MSG_LEN,stdin)); write(sd,message,msg_len); close(sd); exit(EXIT_SUCCESS); }
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define MSG_LEN 1024
#define PORT_NUMBER 7
int main (int argc, char **argv) { int sd, msg_len; char message[MSG_LEN]; struct sockaddr_in addr; struct hostent *hostent; sd = socket (AF_INET, SOCK_STREAM, 0); hostent = gethostbyname (argv[1]);addr.sin_family = AF_INET; addr.sin_port = htons (PORT_NUMBER); //注意这里的网络顺序转换 memcpy (&addr.sin_addr, hostent->h_addr, hostent->h_length); connect (sd, (struct sockaddr *)&addr, sizeof (addr)); msg_len = strlen (fgets (message, MSG_LEN, stdin)); write (sd, message, msg_len); memset (message, 0, MSG_LEN); msg_len = read (sd, message, MSG_LEN); write (STDOUT_FILENO, message, msg_len); close (sd); exit (0); }