완전한 socket 코드

소켓 코드
2010-04-18 16:34:09
#include 
#include
#include
#include
#include
#include
#include
#include
#include

#include

#define MYPORT 1234//
#define BACKLOG 5//
#define BUF_SIZE 200

void mySocket() {
puts("server start....");
// socket
int sockFd;
if ((sockFd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
puts(" socket ");
/*int socket(int domain,int type,int protocol);
socket() socket, ,
。 domain ,
/usr/include/bits/socket.h
domain:
PF_UNIX/PF_LOCAL/AF_UNIX/AF_LOCAL UNIX
PF_INET?AF_INET Ipv4
PF_INET6/AF_INET6 Ipv6
PF_IPX/AF_IPX IPX-Novell
PF_NETLINK/AF_NETLINK
PF_X25/AF_X25 ITU-T X.25/ISO-8208
PF_AX25/AF_AX25 AX.25
PF_ATMPVC/AF_ATMPVC ATM PVCs
PF_APPLETALK/AF_APPLETALK appletalk(DDP)
PF_PACKET/AF_PACKET
type:
SOCK_STREAM , TCP。
OOB , connect() 。
SOCK_DGRAM
SOCK_SEQPACKET
SOCK_RAW
SOCK_RDM
SOCK_PACKET 。
protocol:
socket , , 0 。

socket , -1。
*/

//
int yes = 1;
if (setsockopt(sockFd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {
perror("setsockopt");
exit(1);
}
puts(" ");
/*
int setsockopt(int s,int level,int optname,const void * optval,socklen_toptlen);
s socket 。 level , SOL_SOCKET socket 。 optname , :
SO_DEBUG
SO_REUSEADDR bind()
SO_TYPE socket 。
SO_ERROR socket
SO_DONTROUTE 。
SO_BROADCAST
SO_SNDBUF
SO_RCVBUF
SO_KEEPALIVE 。
SO_OOBINLINE OOB
SO_LINGER 。

optval , optlen optval 。

0, -1, errno。
setsockopt
TCP UDP , setsockopt , ( , Nagle ), setsockopt。
*/

//Socket
struct sockaddr_in serverAddr;
/*
struct sockaddr_in {
   short int sin_family;//sin_family , socket AF_INET
   unsigned short int sin_port;//sin_port ( )
   struct in_addr sin_addr;//sin_addr IP , in_addr
   unsigned char sin_zero[8];//sin_zero sockaddr sockaddr_in 。
  };

  typedef struct in_addr {
   union {
   struct{
   unsigned char s_b1,s_b2,s_b3,s_b4;
   } S_un_b;
   struct {
   unsigned short s_w1,s_w2;
   } S_un_w;
  unsigned long S_addr;//s_addr IP
   } S_un;
  } IN_ADDR;
*/
serverAddr.sin_family = AF_INET;

serverAddr.sin_port = htons(MYPORT);//htons u_short TCP / IP
serverAddr.sin_addr.s_addr = INADDR_ANY;//INADDR_ANY 0.0.0.0 , , “ ”、“ ”。 , 0 。
bzero(&(serverAddr.sin_zero), 8);
//extern void bzero(void *s, int n);
//memset(server_addr.sin_zero, '/0', sizeof(serverAddr.sin_zero));
// s n 。
//bzero memset , bzero , memset
puts("socket ");

//Socket
if (bind(sockFd, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == -1) {
perror("bind");
exit(1);
}
puts("socket ");
/*
bind( socket )
int bind(int sockfd, struct sockaddr * my_addr, int addrlen);

addrlen sockaddr 。
0, -1, errno 。
*/

//
if (listen(sockFd, BACKLOG) == -1) {
perror("listen");
exit(1);
}
puts(" ");
/*
int listen(int s,int backlog);
listen() s socket 。
backlog , client ECONNREFUSED 。
Listen() , socket listen , client accept()。
listen() socket(),bind() , accept()。
0, -1, errno

listen() SOCK_STREAM SOCK_SEQPACKET socket 。 socket AF_INET backlog 128。
*/

socklen_t sinSize;
struct sockaddr_in clientAddr;
sinSize = sizeof(clientAddr);

int maxSock;
maxSock = sockFd;
struct timeval timeOut;
timeOut.tv_sec = 3;//select , 0
timeOut.tv_usec = 0;

fd_set fdsr;
int ret;
int newSockFd = 0;
char buf[BUF_SIZE];

fflush(NULL);//
while (true) {
FD_ZERO(&fdsr);// ,
FD_SET(sockFd, &fdsr);//

ret = select(maxSock + 1, &fdsr, &fdsr, NULL, &timeOut);
if (ret < 0) {
perror("select");
break;
} else if (ret == 0) {
puts("timeout/n");
continue;
}
/*
,select()
int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);
int maxfdp , , 1, !
   fd_set*readfds fd_set , , ,
, ,select 0 ,
, , timeout , timeout ,select 0,
。 NULL , 。
   fd_set*writefds fd_set , , ,
, ,select 0 ,
, , timeout , timeout ,select 0,
。 NULL , 。
   fd_set *errorfds , 。
   struct timeval *timeout select , , select ,
, NULL , , select , ;
, 0 0 , , , , 0, ;
,timeout 0, , select timeout , , , 。
   :
   :select

0: ,
*/

if (FD_ISSET(sockFd, &fdsr)) {
newSockFd = accept(sockFd, (struct sockaddr*)&clientAddr, &sinSize);
if (newSockFd <= 0) {
perror("accept");
continue;
}
printf(" :%s/n", inet_ntoa(clientAddr.sin_addr));
}
/*
int accept(int s,struct sockaddr * addr,int * addrlen);
accept() s socket 。
addr:( ) , , 。Addr 。
addrlen:( ) , addr 。

socket , -1, errno 。
*/

//
int recvRet;
recvRet = recv(newSockFd, buf, sizeof(buf), 0);
printf(" :%s/n", buf);
/*
int recv(int s,void *buf,int len,unsigned int flags);
recv() socket , buf , len 。

flags 0。 :
MSG_OOB out-of-band 。
MSG_PEEK , recv() 。
MSG_WAITALL len , 。
MSG_NOSIGNAL SIGPIPE , -1, errno 。
*/


char* msg = "Hello World";
int len = strlen(msg);
int successLen = send(newSockFd, msg, len, 0);
printf(" :%i/n", successLen);
fflush(NULL);
/**
int send(int s,const void * msg,int len,unsigned int falgs);
s socket。
msg , len 。
flags 0,
MSG_OOB out-of-band 。
MSG_DONTROUTE
MSG_DONTWAIT
MSG_NOSIGNAL SIGPIPE 。

, -1。 errno
*/
}
// Socket
close(sockFd);
}

좋은 웹페이지 즐겨찾기