TCP server
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <linux/if.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define SERVER_PORT 8888
#define BACKLOG 10
int main(int argc, char *argv[])
{
int iSocketServer;
int iSocketClient;
struct sockaddr_in tSocketServerAddr;
struct sockaddr_in tSocketClientAddr;
unsigned int serverport;
int iAddrLen;
unsigned char ucRecvBuf[1000];
int iRecvLen;
int iClientNum = -1;
int opt = 1;
int iRet;
if(argc != 4)
{
printf("Usage:\n");
printf("%s <net> <server_ip> <server_port>\n",argv[0]);
return -1;
}
signal(SIGCHLD,SIG_IGN);
iSocketServer = socket(AF_INET, SOCK_STREAM, 0);
if(iSocketServer == -1)
{
printf("init socket error\n");
return -1;
}
iRet = setsockopt(iSocketServer, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
if(iRet < 0 )
{
printf("setsockopt error\n");
}
struct ifreq ifr;
strcpy(ifr.ifr_name, argv[1]);
iRet = ioctl(iSocketServer, SIOCGIFADDR, &ifr);
if(iRet < 0)
{
printf("ioctl [SIOCGIFADDR] failed");
close(iSocketServer);
return -1;
}
iRet = setsockopt(iSocketServer, SOL_SOCKET, SO_BINDTODEVICE, (char*)&ifr, sizeof(ifr));
if(iRet < 0)
{
printf("setsockopt failed\n");
close(iSocketServer);
return -1;
}
tSocketServerAddr.sin_family = AF_INET;
serverport = atoi(argv[3]);
printf("serverport:%d\n",serverport);
tSocketClientAddr.sin_port = htons((unsigned int)serverport);
tSocketServerAddr.sin_port = htons(SERVER_PORT);
if(inet_pton(AF_INET, argv[2], &tSocketServerAddr.sin_addr) <= 0)
{
printf("invalid server_ip\n");
close(iSocketServer);
return -1;
}
memset(tSocketServerAddr.sin_zero, 0, 8);
iRet = bind(iSocketServer, (const struct sockaddr *)&tSocketServerAddr, sizeof(struct sockaddr));
if(iRet < 0)
{
printf("bind error\n");
return -1;
}
iRet = listen(iSocketServer, BACKLOG);
if(iRet < 0)
{
printf("listen error\n");
return -1;
}
while(1)
{
iAddrLen = sizeof(struct sockaddr);
iSocketClient = accept(iSocketServer,(struct sockaddr *)&tSocketClientAddr, &iAddrLen);
if (-1 != iSocketClient)
{
iClientNum++;
printf("get connnect from client %d: %s\n", iClientNum, inet_ntoa(tSocketClientAddr.sin_addr));
fflush(stdout);
if(!fork())
{
while(1)
{
iRecvLen = recv(iSocketClient, ucRecvBuf, 999, 0);
if(iRecvLen <= 0)
{
close(iSocketClient);
return -1;
}
else
{
ucRecvBuf[iRecvLen] = '\0';
printf("Get message from client %d: %s", iClientNum, ucRecvBuf);
}
}
}
}
}
close(iSocketServer);
return 0;
}
执行sudo ./server lo 127.0.0.1 8888
TCP client
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define SERVER_PORT 8888
#define CLIENT_PORT 1234
int main(int argc, char *argv[])
{
struct sockaddr_in tSocketServerAddr;
struct sockaddr_in tSocketClientAddr;
int iSocketClient;
unsigned int clientport;
unsigned int serverport;
unsigned char ucSendBuf[1000];
int iSendLen;
int opt = 1;
int iRet;
if(argc != 5)
{
printf("Usage:\n");
printf("%s <client_ip> <client_port> <server_ip> <server_port>\n",argv[0]);
return -1;
}
iSocketClient = socket(AF_INET, SOCK_STREAM, 0);
if(iSocketClient == -1)
{
printf("init socket error\n");
return -1;
}
iRet = setsockopt(iSocketClient, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
if(iRet < 0 )
{
printf("setsockopt error\n");
}
tSocketClientAddr.sin_family = AF_INET;
clientport = atoi(argv[2]);
printf("clientport:%d\n",clientport);
tSocketClientAddr.sin_port = htons((unsigned int)clientport);
if(inet_pton(AF_INET, argv[1], &tSocketClientAddr.sin_addr) <= 0)
{
printf("invalid client_ip\n");
close(iSocketClient);
return -1;
}
memset(tSocketClientAddr.sin_zero, 0, 8);
iRet = bind(iSocketClient, (const struct sockaddr *)&tSocketClientAddr,sizeof(struct sockaddr));
if(iRet < 0 )
{
printf("bind error\n");
}
tSocketServerAddr.sin_family = AF_INET;
serverport = atoi(argv[4]);
tSocketServerAddr.sin_port = htons(serverport);
if(0 == inet_aton(argv[3], &tSocketServerAddr.sin_addr))
{
printf("invalid server_ip\n");
close(iSocketClient);
return -1;
}
memset(tSocketServerAddr.sin_zero, 0, 8);
iRet = connect(iSocketClient, (const struct sockaddr *) &tSocketServerAddr,sizeof(struct sockaddr));
if(-1 == iRet)
{
printf("connect error\n");
return -1;
}
while(1)
{
if(fgets(ucSendBuf, 999, stdin))
{
#if 0
iSendLen = sendto(iSocketClient, ucSendBuf, strlen(ucSendBuf),0,
(const struct sockaddr *)&tSocketServerAddr, sizeof(struct sockaddr));
#else
iSendLen = send(iSocketClient, ucSendBuf, strlen(ucSendBuf),0);
#endif
if(iSendLen <=0 )
{
printf("send error\n");
close(iSocketClient);
return -1;
}
}
}
return 0;
}
执行./client 127.0.0.1 54321 127.0.0.1 8888
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)