C語言Socket編程(計算機網絡做業)

最近我計算機網絡課程要作做業了,沒辦法跟着老師一步一步的寫C語言的代碼,使用的計算就是Socket通訊發送消息;代碼實現的功能很簡單,客戶端向服務器端發送消息,服務器端接收客戶端發來的消息,而且輸出顯示到屏幕上;代碼中的每一個socket方法的返回值都應該作判斷出錯狀況,例如:建立SOCKET的建立的時候s句柄(或對象),須要判斷返回值是否爲INVALID_SOCKET,以及socket的全部操做的返回值是否爲SOCKET_ERROR,以保證程序的穩定性,這裏只是測試代碼。服務器

老師是錄製的視頻講解的,其餘其中使用的到的方法要求咱們本身去查相關的MSDN資料庫,若是有不懂的,就本身上網查。網絡

服務器端接收代碼:多線程

#include <Winsock2.h>
#pragma comment(lib,"Ws2_32.lib")
#include <stdio.h>
#include <memory.h>socket

void main()
{
WSAData wsd;
WSAStartup(MAKEWORD(2,0),&wsd);測試

SOCKET s =NULL;
s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
struct sockaddr_in ch;
memset(&ch,0,sizeof(ch));
ch.sin_family=AF_INET;
ch.sin_addr.s_addr=INADDR_ANY;
ch.sin_port=htons(1041);
int b=bind(s,(struct sockaddr *) &ch,sizeof(ch));
#define QUEUE_SIZE 5
int l=listen(s,QUEUE_SIZE);
printf("正在監聽本機的1041端口!\n");
SOCKET sc=accept(s,0,0);
printf("客戶端已經鏈接到本機的1041端口!\n");
#define BUF_SIZE 4096
int receByt=0;
while(1)
{
char buf[BUF_SIZE];
receByt=recv(sc,buf,BUF_SIZE,0);
buf[receByt]='\0';
if(receByt>0)
{
printf("接收的消息是:%s\n",buf);
}
else
{
printf("接收消息結束!");
break;
}

}
int ic=closesocket(sc);
int is=closesocket(s);優化

}spa

======================================================
客戶端發送的代碼:計算機網絡

#include <Winsock2.h>
#pragma comment(lib,"Ws2_32.lib")
#include <stdio.h>
#include <memory.h>
#include <string.h>線程

void main()
{
WSAData wsd;
WSAStartup(MAKEWORD(2,0),&wsd);code

SOCKET s =NULL;
s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
struct sockaddr_in ch;
memset(&ch,0,sizeof(ch));
ch.sin_family=AF_INET;
ch.sin_addr.s_addr=inet_addr("127.0.0.1");
ch.sin_port=htons(1041);

int c=connect(s,(struct sockaddr *) &ch,sizeof(ch));
printf("已經鏈接到服務器的1041端口!如今能夠向服務器發送消息了!\n");
#define BUF_SIZE 4096
char info[1024],buf[BUF_SIZE];

while(1)
{
gets(info);
if(info[0]=='\0')
break;
strcpy(buf,info);
int nsend=send(s,buf,strlen(buf),0);

}
int ic=closesocket(s);
}

========================================================================

程序代碼通過了優化,而且整合多線程,把接收和發送放到同一個文件中,使用參數模式調用發送和接收模塊。增長了建立SOCKET的建立的時候s句柄(或對象)判斷返回值是否爲INVALID_SOCKET,以及socket的bind操做的返回值是否爲SOCKET_ERROR,其餘socket的操做應該也判斷SOCKET_ERROR,以保證程序的穩定性,這裏只是測試代碼就不去寫這麼多了,剩下的就由你我的發揮。

#include <Winsock2.h>
#pragma comment(lib,"Ws2_32.lib")
#include <stdio.h>
#include <memory.h>
#include <string.h>
#include <pthread.h>


void Receive();
void Send();
void creatThread();

SOCKET s =NULL;
pthread_t t[1000];
int threadCount=0;

void main(int argc,char* argv[])
{
    printf("本程序製做人學號:713901040041\n");
    printf("程序說明:服務器端和客戶端爲同一個程序,請使用不一樣的參數運行.\n"); printf("接收程序請使用 r參數;發送程序請使用 s參數。\n"); //printf("len : %d\n", argc); //printf("count %d\n",argc); //printf("value: %s\n",argv[1]); //printf("%d",argv[1][0]=='r'); if(argc<=1) { printf("please input program arguments ...\n"); exit(0); } if(argc>1 && argv[1][0]=='r') { printf("run receive ...\n"); Receive(); } if(argc>1 && argv[1][0]=='s') { printf("run send ...\n"); Send(); } } void* receiveWork(void * args) { SOCKET sc=accept(s,0,0); if(sc==INVALID_SOCKET) { printf("sc Error"); } creatThread(); printf("----------客戶端已經鏈接到本機的%d線程鏈接!\n",threadCount-2); #define BUF_SIZE 4096 int receByt=0; while(1) { char buf[BUF_SIZE]; receByt=recv(sc,buf,BUF_SIZE,0); buf[receByt]='\0'; if(receByt>0) { printf("線程接收的消息是:%s\n",buf); } else { printf("客戶端已退出,"); break; } } int ic=closesocket(sc); printf("服務器結束鏈接!\n"); return NULL; } void creatThread() { pthread_create(&t[threadCount++],NULL,receiveWork,NULL); } void Receive() { WSAData wsd; WSAStartup(MAKEWORD(2,0),&wsd); s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(s==INVALID_SOCKET) { printf("socket created Error"); } struct sockaddr_in ch; memset(&ch,0,sizeof(ch)); ch.sin_family=AF_INET; ch.sin_addr.s_addr=INADDR_ANY; ch.sin_port=htons(1041); int b=bind(s,(struct sockaddr *) &ch,sizeof(ch)); if(b==SOCKET_ERROR) { printf("bind 失敗,出錯代碼是:%d\n",WSAGetLastError()); exit(0); } #define QUEUE_SIZE 5 int l=listen(s,QUEUE_SIZE); printf("正在監聽本機的1041端口!\n"); creatThread(); for(int i=0;i<1000;i++) { pthread_join(t[i],NULL); } int is=closesocket(s); } void Send() { WSAData wsd; WSAStartup(MAKEWORD(2,0),&wsd); SOCKET s =NULL; s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(s==INVALID_SOCKET) { printf("socket created Error"); } struct sockaddr_in ch; memset(&ch,0,sizeof(ch)); ch.sin_family=AF_INET; ch.sin_addr.s_addr=inet_addr("127.0.0.1"); ch.sin_port=htons(1041); int c=connect(s,(struct sockaddr *) &ch,sizeof(ch)); printf("已經鏈接到服務器的1041端口!如今能夠向服務器發送消息了!\n"); #define BUF_SIZE 4096 char info[1024],buf[BUF_SIZE]; while(1) { gets(info); if(info[0]=='\0') break; strcpy(buf,info); int nsend=send(s,buf,strlen(buf),0); } int ic=closesocket(s); }
相關文章
相關標籤/搜索