socket的客户端,服务器范例

来源:互联网 发布:第二代身份证采集软件 编辑:程序博客网 时间:2024/06/07 07:25
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;
}

0 0