1.進一步熟悉和掌握TCP/IP協議的原理。
2.初步了解網絡環境下的程序設計步驟與過程。
3.初步掌握Winsock提供的函數的功能與使用方法。
4.理解網絡的Socket通信。
5.利用Winsock編寫基於TCP或UDP協議的C/S模式網絡通信軟件——一個類似QQ的網絡聊天工具。
這是我們期末大作業的要求,需要用到的只是大概有C# ,socker , MYSQL ,不知道有什麼辦法做成這個,或者有大神可以推薦下C#和MYSQL的自學視頻之類的麼,
所涉及的深度只要能完成大實驗就行,謝謝了~
至於c#微軟的產品,我很不喜歡,所以在c#方面我給不了你的具體的代碼!
在linux ubuntu 請使用gcc編譯器。
我可以給你看看c代碼實現的通信模型:
#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(8888);
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;
}
while(n = recv(connfd, buff, MAXLINE, 0)){
buff[n] = '\0';
printf("recv msg from client: %s\n", buff);
if(!strcmp(buff,"quit")){
close(connfd);
break;
}
}
}
close(listenfd);
}
客戶端:
#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 <port>\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(8888);
//servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
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);
}
while(1){
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);
}
這 只是實現簡單的通信,要實現聊天室的話你需要至少做以下一些事:
(1)使用數據庫,例如mysql管理客戶的賬戶信息
(2)我給你的代碼只是單進程模型,而一個聊天室應該是針對大量用戶的,
所以你應該寫的是並發服務器,在linux你可以使用epoll多路復用配合多線程,
當然,最好是用線程池效率更加高
(3)至於,web方面,你還應該會編寫CGI以調用mysql數據
(4)最後,我建議,要是真想了解socket通訊,你應該精通我給你的代碼
然後再客服通訊時,自己抓包分析,(推薦用wireshark軟件抓包)
這樣你才能真正的理解所謂的三次握手(當然,這是我當初理解socket通訊過程的方式)
希望對你有幫助!