首页 > 其他分享 >socket的客户端,服务器范例

socket的客户端,服务器范例

时间:2022-12-13 16:37:28浏览次数:55  
标签:范例 socket int errno nSocket printf include servaddr 客户端


socket的客户端,服务器范例:


(一)范例一:


(1)服务器端:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<errno.h>

#include<sys/types.h>

#include<sys/socket.h>

#include<netinet/in.h>



#define MAXLINE 4096



int main(int argc, char** argv)

{

int listenfd, connfd;

struct sockaddr_in servaddr;

char buff[4096];

int n;



if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){

printf("create socket error: %s(errno: %d)/n",strerror(errno),errno);

exit(0);

}



memset(&servaddr, 0, sizeof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

servaddr.sin_port = htons(6666);



if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){

printf("bind socket error: %s(errno: %d)/n",strerror(errno),errno);

exit(0);

}



if( listen(listenfd, 10) == -1){

printf("listen socket error: %s(errno: %d)/n",strerror(errno),errno);

exit(0);

}



printf("======waiting for client's request======/n");

while(1){

if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){

printf("accept socket error: %s(errno: %d)",strerror(errno),errno);

continue;

}

n = recv(connfd, buff, MAXLINE, 0);

buff[n] = '/0';

printf("recv msg from client: %s/n", buff);

close(connfd);

}



close(listenfd);

}


(2)客户端:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<errno.h>

#include<sys/types.h>

#include<sys/socket.h>

#include<netinet/in.h>



#define MAXLINE 4096



int main(int argc, char** argv)

{

int sockfd, n;

char recvline[4096], sendline[4096];

struct sockaddr_in servaddr;



if( argc != 2){

printf("usage: ./client <ipaddress>/n");

exit(0);

}



if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){

printf("create socket error: %s(errno: %d)/n", strerror(errno),errno);

exit(0);

}



memset(&servaddr, 0, sizeof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_port = htons(6666);

if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){

printf("inet_pton error for %s/n",argv[1]);

exit(0);

}



if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){

printf("connect error: %s(errno: %d)/n",strerror(errno),errno);

exit(0);

}



printf("send msg to server: /n");

fgets(sendline, 4096, stdin);

if( send(sockfd, sendline, strlen(sendline), 0) < 0)

{

printf("send msg error: %s(errno: %d)/n", strerror(errno), errno);

exit(0);

}



close(sockfd);

exit(0);

}



(3)分析:
上面的服务器使用的是迭代模式的,即只有处理完一个客户端请求才会去处理下一个客户端的请求,这样的服务器处理能力是很弱的,现实中的服务器都需要有并发处理能力!为了需要并发处理,服务器需要fork()一个新的进程或者线程去处理请求等。


---------------------
(二)范例二:
(1)服务器端:

// Server.cpp : Defines the entry point for the console application.

//



#include "stdafx.h"

#include <Winsock2.h>



#pragma comment(lib,"ws2_32.lib")



#define PORT_NUMBER 11234

#define MAX_BUF_SIZE 1024

int _tmain(int argc, _TCHAR* argv[])

{

WSADATA wSaData;

WORD dwSockVersion = MAKEWORD(2,2);

if (0 != WSAStartup(dwSockVersion,&wSaData)) //协商版本号

{

printf("Arrange Version Failure");

return -1;

}



SOCKET nSocket;

nSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //创建TCP socket

if (INVALID_SOCKET == nSocket)

{

printf("invalid socket");

WSACleanup();

return -1;

}



sockaddr_in sa;

sa.sin_family = AF_INET;

sa.sin_addr.s_addr = inet_addr("127.0.0.1");

sa.sin_port = htons(PORT_NUMBER);//选择一个端口号



if (bind(nSocket,(sockaddr *)&sa,sizeof(sa)) < 0) //绑定

{

closesocket(nSocket);


return -1;

}

listen(nSocket,2);



sockaddr_in addr_client;

int nAddrLen = sizeof(addr_client);

while(TRUE)

{

//SOCKET nSock = accept(nSocket,(sockaddr *)&addr_client,&nAddrLen);

SOCKET nSock = accept(nSocket,NULL,NULL);

if (INVALID_SOCKET == nSock)

{

printf("failure to accept");

continue;

}



char tmp[MAX_BUF_SIZE] = {0};

char buf[MAX_BUF_SIZE] = {0};

strcpy(tmp,"this is server");

send(nSock, tmp, (int)strlen(tmp), 0);

int nRecv = recv(nSock, buf, MAX_BUF_SIZE, 0);

if (nRecv > 0)

{

printf("%s/n",buf);

}

closesocket(nSock);



return 0;

}



}





(2)客户端:

// Client.cpp : Defines the entry point for the console application.

//



#include "stdafx.h"

#include <Winsock2.h>



#pragma comment(lib,"ws2_32.lib")



#define MAX_BUF_SIZE 1024

#define PORT_NUMBER 11234

int _tmain(int argc, _TCHAR* argv[])

{



WSADATA wSaData;

WORD dwSockVersion = MAKEWORD(2,2);

if (0 != WSAStartup(dwSockVersion,&wSaData)) //协商版本号

{

printf("Arrange Version Failure");

return -1;

}



SOCKET nSocket;

nSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //创建TCP socket

if (INVALID_SOCKET == nSocket)

{

printf("invalid socket");

WSACleanup();

return -1;

}



sockaddr_in sa;

sa.sin_family = AF_INET;

sa.sin_addr.s_addr = inet_addr("127.0.0.1");

sa.sin_port = htons(PORT_NUMBER);

if ( 0 != connect( nSocket,( const SOCKADDR * )&sa, sizeof(sa) ) )

return -1;



char buf[MAX_BUF_SIZE] = {0};

char tmp[MAX_BUF_SIZE] = {0};

strcpy(tmp,"this is Client!");

int nRecv = 0;

nRecv = recv(nSocket, buf, MAX_BUF_SIZE, 0);

if (nRecv > 0)

{

printf("%s/n",buf);

send(nSocket, tmp, (int)strlen(tmp), 0);

}



closesocket(nSocket);

WSACleanup();



return 0;

}

标签:范例,socket,int,errno,nSocket,printf,include,servaddr,客户端
From: https://blog.51cto.com/u_15911260/5934607

相关文章