accept函数的参数不是随便填的
#include<sys/socket.h>
int accept(int sockfd, struct sockaddr* addr, socklen_t* len)
返回:⾮负描述字——成功, -1——失败
accept默认会阻塞进程,直到有⼀个客户连接建⽴后返回,它返回的是⼀个新可⽤的套接字,这个套接字是连接套接字。此时我们需要区分两种套接字,⼀种套接字正如accept的参数sockfd,它是监听套接字,在调⽤listen函数之后,⼀个套接字会从主动连接的套接字变⾝为⼀个监听套接字;⽽accept返回是⼀个连接套接字,它代表着⼀个⽹络已经存在的点点连接。⾃然要问的是:为什么要有两种套接字?原因很简单,如果使⽤⼀个描述字的话,那么它的功能太多,使得使⽤很不直观,同时在内核确实产⽣了⼀个这样的新的描述字。
如果accept成功返回,则服务器与客户已经正确建⽴连接了,此时服务器通过accept返回的套接字来完成与客户的通信。
参数sockfd
订婚祝福语
参数sockfd就是上⾯解释中的监听套接字,这个套接字⽤来监听⼀个端⼝,当有⼀个客户与服务器连接时,它使⽤这个⼀个端⼝号,⽽此时这个端⼝号正与这个 套接字关联。当然客户不知道套接字这些细节,它只知道⼀个地址和⼀个端⼝号。
参数addr
这是⼀个结果参数,它⽤来接受⼀个返回值,这返回值指定客户端的地址,当然这个地址是通过某个地址结构来描述的,⽤户应该知道这⼀个什么样的地址结 构。如果对客户的地址不感兴趣,那么可以把这个值设置为NULL。
参数len
如同⼤家所认为的,它也是结果的参数,⽤来接受上述addr的结构的⼤⼩的,它指明addr结构所占有的字节个数。同样的,它也可以被设置为NULL。
但是,如果你给accept函数第2和第3个参数赋值后,就要记得“⽤之”,否则就会报错。
血康胶囊举个简单的例⼦
客户端程序都相同,如下:
#include <stdio.h>
#include <string.h>//memt strlen
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <ctime>
#include <arpa/inet.h>
/*
unistd.h 中所定义的接⼝通常都是⼤量针对系统调⽤的封装(英语:wrapper functions)
如 fork、pipe 以及各种 I/O 原语(read、write、clo 等等)
*/
#include <unistd.h>
#include <wait.h>
#define MAX_STR 256
int main(){
char buf[MAX_STR];
char succ[]="success";
char fail[]="failed";
int clientFd;
clientFd=socket(AF_INET,SOCK_STREAM,0);//0:按给定的域和套接字类型选择默认协议
struct sockaddr_in rverAddr;
memt(&rverAddr,0,sizeof(rverAddr));
memt(&rverAddr,0,sizeof(rverAddr));
rverAddr.sin_family=AF_INET;
rverAddr.sin_port=htons(12345);
rverAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
printf("Socket has been created.\n");
int cRes=connect(clientFd,(struct sockaddr*)&rverAddr,sizeof(rverAddr));
//判断是否成功
if(cRes<0){
printf("fail to connect\n");
exit(1);
}el{
printf("connect success!\n");
}
int recvLen=recv(clientFd,(void*)buf,MAX_STR,0);
if(recvLen>0){
printf("recv success:\n");
printf("recv: %s\n",buf);
nd(clientFd,(void*)succ,strlen(succ),0);//不接受带外数据,阻塞式,可将数据路由出本地⽹络 }el{
printf("fail to recv the rver's data\n");
nd(clientFd,(void*)fail,strlen(fail),0);
}
clo(clientFd);
printf("Now the connection has been broken\n");
clo(clientFd);
return 0;
}
服务端1:
acceptFd = accept(rverFd,(struct sockaddr*)&clientAddr,(socklen_t*)&clientLen);
后续程序中使⽤到了clientAddr,clinetLen,程序没有问题
#include <stdio.h>
#include <string.h>//memt strlen
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <ctime>
#include <arpa/inet.h>
/*
unistd.h 中所定义的接⼝通常都是⼤量针对系统调⽤的封装(英语:wrapper functions)
如 fork、pipe 以及各种 I/O 原语(read、write、clo 等等)
*/
#include <unistd.h>
#include <wait.h>
#define MAX_STR 256
int count=0;
int count=0;
int main(){
char buf[MAX_STR];
char sayHello[]="Good morning Mr S!";
int rverFd;
后鼻音的字
rverFd=socket(AF_INET,SOCK_STREAM,0);
int acceptFd;
struct sockaddr_in clientAddr;
int clientLen;
struct sockaddr_in rverAddr;
memt(&rverAddr,0,sizeof(rverAddr));
rverAddr.sin_family=AF_INET;
rverAddr.sin_port= htons(12345);
rverAddr.sin_addr.s_addr=htonl(INADDR_ANY);
bind(rverFd,(sockaddr*)&rverAddr,sizeof(rverAddr));
printf("Socket has been created and bind\n");
listen(rverFd,5);
while(true)
{
printf("--------------------------%d\n",count++);
printf("\n");
/* 接受客户端申请的连接 */
acceptFd = accept(rverFd,(struct sockaddr*)&clientAddr,(socklen_t*)&clientLen);
/* 如果client成功连接到rver, 则执⾏ */
if(acceptFd >= 0){
printf("Now the link has been connected.\n");
/* 从客户端的套接字中提取出IP地址和其他信息*/
int clientip = clientAddr.sin_addr.s_addr;
printf("Client ip : %d.%d.%d.%d\n",clientip&255,(clientip>>8)&255,
(clientip>>16)&255,(clientip>>24)&255);
printf("Client prot : %d\n",ntohs(clientAddr.sin_port));
/
* 使⽤nd向client发送信息 */
sprintf(buf,"THE SEND MSG");
出纳工作内容printf("[SEND] Starting nding [nd] msg ...\n");
nd(acceptFd, (void*)buf, strlen(buf),0);//发送数据 strlen(buff) bytes数据
recv(acceptFd, (void*)buf, MAX_STR, 0 );//接收客户端反馈,成功或失败?//MAXN_STR:最⼤努⼒接收
if(strlen(buf) > 0)
printf("[SUCC] Sending succeed.\n");
el
printf("[FAIL] Sending failed.\n");
/* 关闭此连接 */
clo(acceptFd);
printf("Disconnect the link.\n");
}el{
/* 与client连接失败 */
/* 与client连接失败 */
printf("ERROR: Failed while establish the link!\n");
}
}
clo(rverFd);
return 0;
}
服务端程序2:
acceptFd = accept(rverFd,NULL,NULL);
也没有问题
#include <stdio.h>
#include <string.h>//memt strlen
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <ctime>
#include <arpa/inet.h>
/*
unistd.h 中所定义的接⼝通常都是⼤量针对系统调⽤的封装(英语:wrapper functions)如 fork、pipe 以及各种 I/O 原语(read、write、clo 等等)
*/
#include <unistd.h>
扬州一日游#include <wait.h>
#define MAX_STR 256
int count=0;
int main(){
char buf[MAX_STR];
char sayHello[]="Good morning Mr S!";
int rverFd;
rverFd=socket(AF_INET,SOCK_STREAM,0);
int acceptFd;
struct sockaddr_in clientAddr;
int clientLen;
struct sockaddr_in rverAddr;
memt(&rverAddr,0,sizeof(rverAddr));
rverAddr.sin_family=AF_INET;
rverAddr.sin_port= htons(12345);
rverAddr.sin_addr.s_addr=htonl(INADDR_ANY);
bind(rverFd,(sockaddr*)&rverAddr,sizeof(rverAddr));
printf("Socket has been created and bind\n");
listen(rverFd,5);
while(true)
while(true)
{
printf("--------------------------%d\n",count++);
发财树种植
printf("\n");
/* 接受客户端申请的连接 */
acceptFd = accept(rverFd,NULL,NULL);
/* 如果client成功连接到rver, 则执⾏ */
if(acceptFd >= 0){
printf("Now the link has been connected.\n");
/* 从客户端的套接字中提取出IP地址和其他信息
int clientip = clientAddr.sin_addr.s_addr;
printf("Client ip : %d.%d.%d.%d\n",clientip&255,(clientip>>8)&255,
(clientip>>16)&255,(clientip>>24)&255);
printf("Client prot : %d\n",ntohs(clientAddr.sin_port));*/
/* 使⽤nd向client发送信息 */
sprintf(buf,"THE SEND MSG");
printf("[SEND] Starting nding [nd] msg ...\n");
nd(acceptFd, (void*)buf, strlen(buf),0);//发送数据 strlen(buff) bytes数据
recv(acceptFd, (void*)buf, MAX_STR, 0 );//接收客户端反馈,成功或失败?//MAXN_STR:最⼤努⼒接收
if(strlen(buf) > 0)
printf("[SUCC] Sending succeed.\n");
el
printf("[FAIL] Sending failed.\n");
/* 关闭此连接 */
clo(acceptFd);
printf("Disconnect the link.\n");
}el{
/* 与client连接失败 */
printf("ERROR: Failed while establish the link!\n");
}
}
clo(rverFd);
return 0;
}400米跑步技巧
但是,如果你使⽤了
acceptFd = accept(rverFd,(struct sockaddr*)&clientAddr,(socklen_t*)&clientLen);
却没有⽤之,程序就会报错!可以⾃⼰试下如下程序,具体原因不知道,但是恶⼼是恶⼼够了。。。
#include <stdio.h>
#include <string.h>//memt strlen
#include <stdlib.h>
#include <sys/types.h>
国旗多美丽
#include <sys/stat.h>
#include <sys/socket.h>
#include <ctime>
#include <arpa/inet.h>