완전한 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);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
c 언어 간단한 파일 r/w 조작 방법데이터의 입력과 출력은 거의 모든 C 언어 프로그램과 수반된다. 입력이란 원본에서 데이터를 얻는 것이다. 출력은 단말기에 데이터를 쓰는 것으로 이해할 수 있다.이곳의 원본은 키보드, 마우스, 하드디스크, 시디, 스캐...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.