文档声明:
以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。
笔记资料仅供学习交流使用,转载请标明出处,谢谢配合。
如果存在相关知识点的遗漏,可以在评论区留言,看到后将在第一时间更新。
作者:Aliven888
客户端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define SERVER_PORT 20001
#define SERVER_IP "127.0.0.1"
int main()
{
int sock_fd;
struct sockaddr_in addr_server;
if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("socket");
exit(1);
}
printf("sock successful\n");
{
bool bReuseaddr = TRUE;
setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&bReuseaddr, sizeof(bool) );
BOOL bDontLinger = FALSE;
setsockopt(sock_fd, SOL_SOCKET, SO_DONTLINGER, (const char*)&bDontLinger, sizeof(bool));
int iSecond = 1;
setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&iSecond, sizeof(iSecond));
setsockopt(sock_fd, SOL_SOCKET, SO_SNDTIMEO, (const char*)&iSecond, sizeof(iSecond));
int iRecvBufLen = 32 * 1024;
setsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, (const char*)&iRecvBufLen, sizeof(int) );
int iSendBufLen = 32*1024;
setsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, (const char*)&iSendBufLen, sizeof(int) );
int iZero = 0;
setsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, (char *)&iZero, sizeof(iZero) );
int iZero = 0;
setsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, (char *)&iZero, sizeof(int) );
bool bBroadcast = true;
setsockopt(sock_fd, SOL_SOCKET, SO_BROADCAST, (const char*)&bBroadcast, sizeof(bool));
bool bConditionalAccept = true;
setsockopt(sock_fd, SOL_SOCKET, SO_CONDITIONAL_ACCEPT, (const char*)&bConditionalAccept, sizeof(bool));
struct linger {
u_short l_onoff;
u_short l_linger;
};
struct linger m_sLinger;
m_sLinger.l_onoff = 1;
m_sLinger.l_linger = 5;
setsockopt(sock_fd, SOL_SOCKET, SO_LINGER, (const char*)&m_sLinger, sizeof(struct linger));
}
memset(&addr_server, 0, sizeof(addr_server));
addr_server.sin_family = AF_INET;
addr_server.sin_port = htons(SERVER_PORT);
addr_server.sin_addr.s_addr = inet_addr(SERVER_IP);
if(connect(sock_fd, (struct sockaddr *)&addr_server, sizeof(struct sockaddr))<0)
{
perror("connect");
exit(1);
}
printf("connect successful\n");
send(sock_fd, "ok", 2, 0);
close(sock_fd);
}
服务端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 20001
int main()
{
int sock_fd, client_fd;
int addr_client_len;
struct sockaddr_in addr_server, addr_client;
addr_client_len = sizeof(struct sockaddr);
if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("socket");
exit(1);
}
printf("sock successful\n");
{
bool bReuseaddr = TRUE;
setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&bReuseaddr, sizeof(bool) );
BOOL bDontLinger = FALSE;
setsockopt(sock_fd, SOL_SOCKET, SO_DONTLINGER, (const char*)&bDontLinger, sizeof(bool));
int iSecond = 1;
setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&iSecond, sizeof(iSecond));
setsockopt(sock_fd, SOL_SOCKET, SO_SNDTIMEO, (const char*)&iSecond, sizeof(iSecond));
int iRecvBufLen = 32 * 1024;
setsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, (const char*)&iRecvBufLen, sizeof(int) );
int iSendBufLen = 32*1024;
setsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, (const char*)&iSendBufLen, sizeof(int) );
int iZero = 0;
setsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, (char *)&iZero, sizeof(iZero) );
int iZero = 0;
setsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, (char *)&iZero, sizeof(int) );
bool bBroadcast = true;
setsockopt(sock_fd, SOL_SOCKET, SO_BROADCAST, (const char*)&bBroadcast, sizeof(bool));
bool bConditionalAccept = true;
setsockopt(sock_fd, SOL_SOCKET, SO_CONDITIONAL_ACCEPT, (const char*)&bConditionalAccept, sizeof(bool));
struct linger {
u_short l_onoff;
u_short l_linger;
};
struct linger m_sLinger;
m_sLinger.l_onoff = 1;
m_sLinger.l_linger = 5;
setsockopt(sock_fd, SOL_SOCKET, SO_LINGER, (const char*)&m_sLinger, sizeof(struct linger));
}
memset(&addr_server, 0, sizeof(addr_server));
addr_server.sin_family = AF_INET;
addr_server.sin_port = htons(PORT);
addr_server.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sock_fd, (struct sockaddr *)&addr_server, sizeof(struct sockaddr_in)) < 0)
{
perror("bind");
exit(1);
}
printf("bind sucessful\n");
if(listen(sock_fd, 5))
{
perror("listen");
exit(1);
}
printf("listen sucessful\n");
char buf[1024];
while(1)
{
memset(buf, '\0', 1024);
if((client_fd = accept(sock_fd, (struct sockaddr *)&addr_client, &addr_client_len)) < 0)
{
perror("accept");
exit(1);
}
int len = recv(client_fd, buf, sizeof(buf), 0);
printf("accept client ip: %s : %s\n", inet_ntoa(addr_client.sin_addr), buf);
send(client_fd, "ok", 2, 0);
close(client_fd);
}
close(sock_fd);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)